Справочная информация:
Я нашел эту статью на JavaWorld, где Аллен Голуб объясняет альтернативу геттерам / сеттерам, которая поддерживает принцип, согласно которому реализация объекта должна быть скрыта (его примеркод также можно найти ниже).
Объясняется, что классы Name
/ EmployeeId
/ Money
должны иметь конструктор, принимающий одну строку - причина в том, что если вы наберете его какint
, а затем нужно изменить его на long
, вам придется изменить все виды использования класса, и с этим шаблоном вам не нужно.
Вопрос 1:
Мне было интересно: разве это не переносит проблему на анализ разбрасываемых параметров String
?Например, если весь код, использующий EmployeeId
(полученный от Exporter
), анализирует String
в int
, и внезапно вы начинаете экспортировать значения long
, вам необходимо изменить столько же вариантов использования.... и если вы начнете анализировать его как long
, возможно, его придется заменить на double
(даже если для идентификаторов это не имеет смысла) ... и если вы не можете быть уверены, что анализироватьString
в, вы не можете ничего реализовать .
Вопрос 2:
Помимо этого вопроса, у меня есть еще один: я понимаю, что статья более семи летСтарый, так может кто-нибудь указать мне на некоторые недавние обзоры, касающиеся ОО-дизайна, и, в частности, на идеи, касающиеся дебатов о методах получения / установки и скрытия реализации?
Листинг 1. Сотрудник: Контекст Builder
public class Employee
{ private Name name;
private EmployeeId id;
private Money salary;
public interface Exporter
{ void addName ( String name );
void addID ( String id );
void addSalary ( String salary );
}
public interface Importer
{ String provideName();
String provideID();
String provideSalary();
void open();
void close();
}
public Employee( Importer builder )
{ builder.open();
this.name = new Name ( builder.provideName() );
this.id = new EmployeeId( builder.provideID() );
this.salary = new Money ( builder.provideSalary(),
new Locale("en", "US") );
builder.close();
}
public void export( Exporter builder )
{ builder.addName ( name.toString() );
builder.addID ( id.toString() );
builder.addSalary( salary.toString() );
}
//...
}