2012-07-19 108 views
1

我有一個演示腳本,它很好地顯示了問題,因此我將顯示腳本,然後詢問。方法()應該放在哪裏?

class Program 
{ 
    static void Main(string[] args) 
    { 
     Dog dog = new Dog() { Age = 4 }; 

     //This approach (version A) 
     dog.DisplayDogYears(); 

     //Or this approach (version B) 
     displayDogYears(dog); 

     Console.ReadKey(); 
    } 

    private static void displayDogYears(Dog d) 
    { 
     Console.WriteLine("The dog is {0} years old in human years.", d.Age * 7); 
    } 
} 

public class Dog 
{ 
    public int Age { get; set; } 

    public void DisplayDogYears() 
    { 
     Console.WriteLine("The dog is {0} years old in human years.", Age * 7); 
    } 
} 

有兩種方法可以做同樣的事情(方法A和B)。在可伸縮性和可讀代碼方面,是否有任何理由偏好一種方法而不是另一種方法。我可以看到方法A的一個優點是,該方法可用於Dog類的所有實例(所以很好,可擴展且可重用且可維護,但是,在調試時,它意味着我必須在不同的類之間移動(並且VS具有跳轉到不同的文件等),而不是隻在一個文件查看一切

任何想法

戴夫

+0

我把用戶視圖輸出到視圖層。雖然,對於控制檯應用程序來說,好處大部分都會丟失。 – 2012-07-19 13:57:53

回答

7

我寧願在類犬的方法:?

public int GetAgeInHumanYears() 
{ 
    return Age*7; 
} 

並調用此方法從主要的一個你喜歡的格式字符串。

+0

哎呀,錯誤地命中「無用(-1)」 - 我嘗試添加1(我現在已經完成),所以很抱歉!這是一個更好的方法,只是因爲我可以決定如何處理號碼。我想如果我總是想把它寫成一個控制檯,那麼原始帖子會更好,但如果我想控制我對結果做什麼,那麼你的方法FTW!謝謝 – Dave 2012-07-19 13:39:20

+1

+1這是要走的路。 Dog類與控制檯有什麼關係?沒什麼,所以它不應該知道控制檯是什麼,也不會使用它。如果我想在Windows應用程序中使用它,該怎麼辦?長話短說,保持你的「模型」類的框架或用戶界面功能。 – dowhilefor 2012-07-19 13:41:55

+0

謝謝dowhilefor – Dave 2012-07-19 13:46:07

3

這種方法會更好。因爲你的班級不直接輸出任何東西。所以一切仍然由main類控制。它讓我更容易閱讀代碼正在做什麼。

class Program 
{ 
    static void Main(string[] args) 
    { 
     Dog dog = new Dog() { Age = 4 }; 

     //This approach (version A) 
     Console.WriteLine(dog.DisplayDogYears()); 

     Console.ReadKey(); 
    } 


} 

public class Dog 
{ 
    public int Age { get; set; } 

    public String DisplayDogYears() 
    { 
     return("The dog is {0} years old in human years.", Age * 7); 
    } 
} 
+0

敬畏,費利斯Pollano擊敗我衝。 – 2012-07-19 13:40:29

+0

這是偉大的。很好,可維護。再次,像Felice的迴應,你贊成選項A!感謝您花時間回答。 – Dave 2012-07-19 13:40:33

+0

選項A是比較傳統的選項。在更大的項目中選項B往往變得不利。 – 2012-07-19 13:42:14

2

這確實是一個偏好問題。

我可能是措辭的這個休息不好,而是沒有去太深:

有幾個因素要考慮:

  • 可讀性
  • 代碼重用
  • 維護程序員差誰將不得不維護它。 (但這可能是可讀性)

在這個例子中,我認爲所有的因素都指向它在Dog類中。

代碼中的類應該反映真實的對象。

  • 可讀性:對我來說,一隻狗有一個年齡和狗年,所以它應該是狗的財產。 (這是選項C - 在你的問題中未顯示),而不是調用程序中的方法。
  • 代碼重用:如果您編寫另一個需要使用Dog類的應用程序,並且需要在Dog Years中獲得年齡,則必須重寫代碼。

簡而言之,現實生活中的代碼對象映射是,狗年是狗的一部分,而不是調用程序。

4

在這種情況下,該方法應該在類(Dog)上,因爲它是Dog對象特有的功能。順便說一下,狗 - >人類年不是一個簡單的幾何乘法 - 隨着狗老化,曲線開始變平滑,所以乘數減少。

Dog Years

+0

+1狗年事實! – RhysW 2012-07-19 13:52:31

4

調試時,它意味着我有不同的類別之間移動(與VS具有跳轉到不同的文件等),而不是隻在一個文件

是所有觀看的一切你的鑰匙在一個巨大的鑰匙圈上?你所有的紙質文件都堆在你的桌子上嗎?

單獨的方法到它們所屬的類中。也許你實際上需要一個第三個類從狗年(或一般動物年)轉換爲人類年。將所有內容都放在一個(或幾個)類中,可以限制重用,可維護性(您必須在調試器中運行程序以瞭解它在做什麼)以及可擴展性。

+0

+1,適合日常參考,例如大量的紙張! – RhysW 2012-07-19 13:49:45

+0

我從來沒有想過,(我們是無紙化的,但我想這意味着我錯過了這一點:)) - 是的,當然我把所有東西都歸檔到它所屬的地方。謝謝。 – Dave 2012-07-19 13:54:52

3

戴夫,這是一個隔離的問題。如果您要添加Cat類,該怎麼辦?你會添加一個新的方法說DisplayCatYears?如果你在Dog類中擁有它 - 你可以爲此提取通用接口,並且有一種方法通過利用多態性將動物年齡作爲參數寫入。

更重要的是,當您的程序超過幾個屏幕長度時,我認爲您不會感到舒服,並且會在一個文件中包含所有內容。

+0

我的天啊 - 我已經把X帖子講述了爲什麼要使用接口,並且在一個簡單的突破中,你不僅解答了我的問題,而且解釋了接口的用法。謝謝 – Dave 2012-07-19 13:50:17

2

那麼最好的實踐也說每個類都有自己的,所以狗類不會與應用程序的主要部分,但保持獨立。通過這個邏輯,最好讓每個與該類有關的方法都在類內。例如,假設您有20個課程,每個用不同方法計算年齡的20個動物,您是否想要在同一頁面上隨機拋出所有20個課程和所有20個方法?是?那麼你有什麼問題!

您希望保持代碼的清潔和可訪問性,每個類都是獨立的,每個方法都是專門針對該類的。例如,狗類不需要知道如何計算貓年,它與它本身無關,因此貓類貓年,狗類狗年,

這是更整潔,易於使用和閱讀,也更好的重用性!如果你現在想在另一個項目中使用你的狗類,你將不得不首先分類,然後通過代碼行尋找所需的所有方法。如果他們在一個地方,所有這一切都會在一個地方,它會加快你的編碼,並讓你繼續面對更大的挑戰!

我甚至不會提到,您希望重用的類應該放在共享庫中以便重用。

0

將您的Dog類與Console分開,但仍然允許您的Dog類顯示其自己的年齡。

public class Dog 
{ 
    public int Age { get; set; } 
    private int dogYears { get { return Age * 7; } } 

    public void DisplayDogYears(TextWriter writer) 
    { 
     writer.WriteLine(
      "The dog is {0} years old in human years.", 
      dogYears); 
    } 
} 

然後,您可以顯示狗年內任何TextWriter

static void Main(string[] args) 
{ 
    var dog = new Dog { Age = 4 }; 

    // This will output to the console 
    dog.DisplayDogYears(Console.Out); 

    // This will output to the 'sb' StringBuilder 
    var sb = new StringBuilder(); 
    dog.DisplayDogYears(new StringWriter(sb)); 
} 
0

取決於

你需要的方法能夠被稱爲在不同的班級,也就是你想要的可重複使用的?選擇A.

是否僅在一個類/方法中使用B.