ken*_*ner 5 oop unit-testing encapsulation
考虑以下课程
public class Class1
{
public int A { get; set; }
public int B { get; set; }
public int GetComplexResult()
{
return A + B;
}
}
Run Code Online (Sandbox Code Playgroud)
为了使用GetComplexResult,该类的使用者必须知道在调用该方法之前A和B之前.如果GetComplexResult访问许多属性来计算其结果,如果使用者未首先设置所有适当的属性,则可能导致错误的返回值.所以你可以这样写这个类
public class Class2
{
public int A { get; set; }
public int B { get; set; }
public int GetComplexResult(int a, int b)
{
return a + b;
}
}
Run Code Online (Sandbox Code Playgroud)
这样,调用者GetComplexResult被强制传递所有需要的值,确保正确计算预期的返回值.但是如果有许多必需的值,参数列表也会增长,这似乎也不是好的设计.它似乎也破坏了封装的重点A,B并且GetComplexResult在单个类中.我甚至可能想要创建GetComplexResult静态,因为它不需要类的实例来完成它的工作.我不想绕过一堆静态方法.
是否有术语来描述这两种不同的创建类的方法?他们似乎都有利有弊 - 有什么我不理解应该告诉我,一种方式比另一种更好?单元测试如何影响这一选择?
如果你使用一个真实的例子,答案就会变得更加清晰.
public class person
{
public string firstName { get; set; }
public string lastName { get; set; }
public string getFullName()
{
return firstName + " " + lastName;
}
}
Run Code Online (Sandbox Code Playgroud)
实体对象的要点是它包含有关实体的信息,并且可以执行实体需要执行的操作(基于其包含的信息).所以是的,有些情况下某些操作无法正常工作,因为实体尚未完全初始化,但这不是设计失败.如果,在现实世界中,我问你一个尚未命名的新生婴儿的全名,那也将失败.
如果某些属性对于执行其工作的实体至关重要,则可以在构造函数中初始化它们.另一种方法是使用布尔值来检查实体是否处于可以调用给定方法的状态:
while (person.hasAnotherQuestion()) {
person.answerNextQuestion();
}
Run Code Online (Sandbox Code Playgroud)