2012-07-19 110 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.