我有一个演示脚本,可以很好地显示问题所以我会显示脚本,然后问。
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 :(得分:7)
我更喜欢在Dog类中使用方法:
public int GetAgeInHumanYears()
{
return Age*7;
}
并使用您喜欢的格式字符串从main调用此方法。
答案 1 :(得分:4)
在这种情况下,该方法应该在类(Dog)上,因为它是特定于Dog对象的功能。
顺便说一句,狗 - >人类年份不是简单的几何乘法 - 随着狗年龄的增长,曲线开始平滑,因此乘数减少。
答案 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)
更重要的是,当你的节目超过几个屏幕长度时,我认为你不会感到舒服,并且将所有内容放在一个文件中。
答案 5 :(得分:2)
这确实是一个偏好问题。
我可能会对其余部分进行严厉措辞,但不要太深入:
有几个因素需要考虑:
在这个例子中,我认为所有因素都指向在Dog类中使用它。
代码中的类应该反映现实生活中的对象。
简而言之,现实生活到代码对象的映射是狗年是狗的一部分,而不是调用程序。
答案 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进行调用。