我有一个设计问题,我可以使用一些建议。假设我们需要(如何原创......)我们的新应用程序中的员工。我通常会做的是这样的:使用访问器:好还是坏?
public interface IEmployee
{
string EmployeeId { get; }
string Name { get; }
void Update(string newName, ...);
...
}
public class Employee : IEmployee
{
public Employee(string id, string name, ...)
{
}
...
}
这从数据源中获取员工
public class SqlEmployeeRepository : IEmployeeRepository
{
...
public IEmployee GetEmployee(string id)
{
...
IEmployee employee = new Employee(id, name, ...);
return employee
}
public IEmployee SaveEmployee(IEmployee employee)
{
// Execute SQL command.
}
}
可视化将是这个样子:
TextBox nameTextBox = new TextBox();
...
nameTextBox.Text = employee.Name;
和保存会看像这样:
string name = nameTextBox.Text;
employee.Update(name, ...);
myEmployeeRepository.Save(employee);
到目前为止,这么好。但后来我运行了this和this文章,他们让我不知道应用程序在没有getter的情况下会是什么样子(静态的和动态的),所以我尝试使用第二篇文章中描述的技术不使用getter来实现上述应用程序。我想出了这个:
public interface IEmployee
{
public interface Importer
{
string ProvideId();
string ProvideName();
...
}
public interface Exporter
{
void AddId();
void AddName();
...
}
void Export(IExporter exporter)
...
}
public class Employee : IEmployee
{
private string _id;
private string _name;
public Employee(IEmployee.Importer importer)
{
_id = importer.ProvideId();
_name = importer.ProvideName();
...
}
public void Export(IEmployee.Exporter exporter)
{
exporter.AddId(_id);
exporter.AddName(_name);
...
}
}
然后仓库变为:
public class SqlEmployeeExporter : IEmployee.Exporter
{
...
public void Save() { ... }
}
public class SqlEmployeeRepository : IEmployeeRepository
{
...
public IEmployee GetEmployee(string id)
{
IEmployee.Importer importer = new SqlEmployeeImporter(id);
IEmployee employee = new Employee(importer);
return employee
}
public IEmployee SaveEmployee(IEmployee employee)
{
SqlEmployeeExporter exporter = new SqlEmployeeExporter();
employee.Export(exporter);
exporter.Save();
}
}
可视化变为:
EmployeeNameTextBoxExporter exporter = new EmployeeNameTextBoxExporter();
employee.Export(exporter);
exporter.Render();
而且东西similair用于保存。
虽然后者的实现删除了获取者对Employee
的必要性,因此是更好的数据封装形式,但它也似乎有点臃肿和过于复杂。你对这件事有什么看法?我是否缺少或误解文章中的某些内容?你对使用吸气剂(和吸附剂)有何一般意见?
这个小实验让我倾向于现在使用accessor方法。也许你可以改变主意:-)
看来你的'出口商'对象实际上是一个DTO:http://en.wikipedia.org/wiki/Data_transfer_object – Sjoerd 2010-09-10 07:41:28
你提到的文章是相当有争议的(特别是标题),应该用捏盐:-)共同的理解是,他们一般不反对getter/setters,而只是针对暴露_unnecessary_ getters/setters。这已经在SO上进行了讨论,例如http://stackoverflow.com/questions/2747721/getters-and-setters-are-bad-oo-design,http://stackoverflow.com/questions/565095/java-are-getters-and-setters-evil – 2010-09-10 07:50:12