乙個同事維護
delphi
**的時候發現原來
的軟體內有很多
with
。過多的
with
讓**難以除錯。 引入
with
的本意在於節省重複出現的物件名。比如說,如果有這樣的呼叫:
function foo ()
begin
objecta.prop1 = "a";
objecta.prop2 ="b";
objecta.run();
end那麼可以採用
with
讓**顯得簡潔:
with objecta do
begin
prop1 ="a";
prop2 = "b";
run();
end;
在這樣的情況下,使用
with
無可厚非。因為這樣的**確實簡潔,並且並不影響**的可讀性。
問題是有些
with
用的太過頭了。最典型的是
with
巢狀with
,並且乙個
with
內有多個
property
和method
的呼叫,很難看出那個屬性是哪個物件的。這樣就使用的過度了。
和delphi
不同,在
c#內根本就不支援
with
。和with
類似的using
也只是為了
dispose
的目的,而不是為了**更加簡潔。那麼在
c#內,遇到類似的**要如何做呢?
其實上面的例子**內,隱隱的躲藏著乙個設計問題:就是**的分工並不合理。**的全部工作由函式
foo和
objecta
來承擔。在
foo內大量的引用物件
objecta,
這是一種職責不清晰的跡象:說明
foo做了很多本來屬於
objecta
的工作。
如果把這些工作分配有
objecta
來完成,那麼**應該是這樣的:
class a
foo()
begin
prop1 ="a";
prop2 = "b";
run();
end而呼叫方
foo這樣:
function foo()
begin
objecta.foo()
end自然的,既然所有的**呼叫都在
classa
內部發生,那麼本來天經地義應該使用
with
的場合,就在職責清晰的過程中,自然的變得並無必要了。
with
並非絕對不可應用,也不是所有的**都必須清晰職責,只要不影響閱讀和使用,**質量並不下降的情況下,
with
也是可以用的。
從彙編角度看引用
引用型別到底是什麼?它和指標有什麼關係?它本身占用記憶體空間嗎?帶著這些疑問,我們來進行分析。先看 include include using namespace std void main 通過彙編檢視 如下 9 int x 1 00401048 mov dword ptr ebp 4 1 10 ...
從辯證的角度看產品
從辯證的角度看產品 然而,當我們用我們自身的思維角度去看待一款產品時,往往可能由於對產品接觸的時間太少,或者是使用到功能的不全面,導致我們對一款產品的認識只能達到乙個有限的程度,這往往是不可避免的。同樣的,當我們要去開發一款產品,往往可能由於對產品真正需求的不確定,或者是考慮的不夠周全,導致我們希望...
從彙編的角度看棧
大家都知道,棧區是儲存函式,區域性變數的一塊記憶體區域。那麼讓我們從彙編的角度,來看看函式的執行過程。首先,當我們使用pushl將資料入棧時,棧頂會移動,以容納新增加的值。實際上,我們能不斷將值入棧,棧會在記憶體中保持向下增長,知道存放 或資料的地方。那麼,我們如何知道棧頂位址呢?棧暫存器 esp總...