方法()应该放在哪里?

时间:2012-07-19 13:34:49

标签: c# function methods

我有一个演示脚本,可以很好地显示问题所以我会显示脚本,然后问。

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具有跳转到不同的文件等)而不是只在一个文件中查看所有内容。

有什么想法吗?

戴夫

9 个答案:

答案 0 :(得分:7)

我更喜欢在Dog类中使用方法:

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

并使用您喜欢的格式字符串从main调用此方法。

答案 1 :(得分:4)

在这种情况下,该方法应该在类(Dog)上,因为它是特定于Dog对象的功能。

顺便说一句,狗 - >人类年份不是简单的几何乘法 - 随着狗年龄的增长,曲线开始平滑,因此乘数减少。

Dog Years

答案 2 :(得分:4)

  

调试时确实意味着我必须在不同的类之间移动(VS必须跳转到不同的文件等)而不是只在一个文件中查看所有内容

你的所有钥匙都放在一个巨大的钥匙圈上吗?您的所有纸质文件都放在桌面上吗?

将方法分成它们所属的类。也许你真的需要一个第三个​​类来从狗年(或一般动物年)转换为人类年。将所有内容都放在一个(或几个)类中会限制重用,可维护性(您必须在调试器中运行程序以确定它正在做什么)和可扩展性。

答案 3 :(得分: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);
    }
}

答案 4 :(得分:3)

戴夫,这是一个隔离问题。如果您要添加Cat类怎么办?你会添加一个说DisplayCatYears的新方法吗?如果你在Dog类中有它 - 你可以为此提取通用接口,并且有一种方法通过利用多态性将动物的年龄作为参数传递。

更重要的是,当你的节目超过几个屏幕长度时,我认为你不会感到舒服,并且将所有内容放在一个文件中。

答案 5 :(得分:2)

这确实是一个偏好问题。

我可能会对其余部分进行严厉措辞,但不要太深入:

有几个因素需要考虑:

  • 可读性
  • 代码重用
  • 糟糕的维护程序员,他将不得不维护它。 (但这可能是可读性)

在这个例子中,我认为所有因素都指向在Dog类中使用它。

代码中的类应该反映现实生活中的对象。

  • 可读性:对我来说,一只狗有多年的年龄,而在Dog Years,所以它应该是狗的财产。 (这是选项C - 在您的问题中未显示)而不是调用程序中的方法。
  • 代码重用:如果您编写另一个需要使用Dog类的应用程序,并且需要在Dog Years中获得年龄,则必须重写代码。

简而言之,现实生活到代码对象的映射是狗年是狗的一部分,而不是调用程序。

答案 6 :(得分:2)

最好的做法也说每个班级都是独立的,所以Dog类不适用于应用程序的主要部分但是保持独立。通过这种逻辑,最好将与该类相关的每个方法都放在类中。例如,假设您有20个班级,20个动物,每个都有不同的计算年龄的方式,您是否希望在同一页面上随机抛出所有20个班级和所有20个方法?是?那么你有什么问题!

您希望保持代码的清洁和可访问性,每个类本身,每个类都专门针对该类中的类。例如,Dog类不需要知道Cat年的计算方式,它与自身无关,因此cat class中的猫年,狗类中的狗年,

这更整洁,易于使用和阅读,并且更易于重复使用!说你现在想在另一个项目中使用你的狗类,你将不得不首先切掉这个类,然后通过代码行来寻找所需的所有方法。如果它们在一个地方,它会加速你的编码,让你继续迎接更大的挑战!

我甚至不会提到你希望重用的类应该在共享库中,以便于重用。

答案 7 :(得分: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));
}

答案 8 :(得分:0)

取决于

您是否需要能够在不同类中调用该方法,即您希望它可重用?选择A.

是否仅在一个类/方法中使用B进行调用。