我有一個設計問題,我可以使用一些建議。假設我們需要(如何原創......)我們的新應用程序中的員工。我通常會做的是這樣的:使用訪問器:好還是壞?
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