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

有什么想法吗?

戴夫

4

9 回答 9

7

我希望在 Dog 类中有一个方法:

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

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

于 2012-07-19T13:37:43.683 回答
4

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

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

狗年

于 2012-07-19T13:42:07.267 回答
4

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

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

将方法分成它们所属的类。也许您实际上需要第三类才能从狗年(或一般动物年)转换为人类年。将所有内容放在一个(或几个)类中会限制重用性、可维护性(您必须在调试器中运行程序才能弄清楚它在做什么)和可扩展性。

于 2012-07-19T13:45:45.533 回答
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);
    }
}
于 2012-07-19T13:39:22.707 回答
3

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

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

于 2012-07-19T13:45:47.477 回答
2

这确实是一个偏好问题。

我可能会在其余部分措辞不好,但不会太深:

有几个因素需要考虑:

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

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

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

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

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

于 2012-07-19T13:41:39.237 回答
2

最佳实践还说每个类都有自己的类,因此 Dog 类不会与应用程序的主要部分一起,而是保持独立。按照这种逻辑,最好将与该类相关的每个方法都放在该类中。例如,假设您有 20 个班级,20 只动物,每个班级都有不同的年龄计算方式,您是否希望将所有 20 个班级和所有 20 种方法随机扔在同一页面上?是的?那么你有什么问题!

您希望保持代码干净和可访问,每个类都独立,每个方法都专门用于其中的那个类。例如,Dog 类不需要知道 Cat 年数是如何计算的,它与自身无关,因此 cat 类中的 cat 年,dog 类中的 dog 年,

这更整洁,易于使用和阅读,并且可重用性更好!假设您现在想在另一个项目中使用您的 dog 类,您将不得不先切出该类,然后在代码行中寻找该类所需的所有方法。如果他们在里面,都在一个地方,它将加快你的编码速度,让你继续迎接更大的挑战!

我什至不会提及您希望重用的类应该在共享库中以便于重用。

于 2012-07-19T13:46:25.663 回答
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));
}
于 2012-07-19T13:52:15.847 回答
0

依靠,

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

是否仅在一个类/方法中使用 B.

于 2012-07-19T13:58:29.990 回答