JavaWorld в OO: Getters / Setters vs Builder

Предпосылки:

Я нашел эту статью на JavaWorld, где Аллен Холуб объясняет альтернативу геттерам / сеттерам, которая поддерживает принцип, согласно которому реализация объекта должна быть скрыта (его пример кода также можно найти ниже).

Объясняется, что классы Name / EmployeeId / Money должен иметь конструктор, принимающий единственную строку - причина в том, что если вы введете его как int , и позже необходимо изменить его на long , вам придется изменить все способы использования класса, и с этим шаблон, который вам не нужен.

Вопрос 1:

Мне было интересно: разве это не переносит проблему просто на анализ разбрасываемых параметров String ? Например, если весь код, использующий EmployeeId (полученный от Exporter ), анализирует строку String в int ], и вдруг вы начните экспортировать длинные значения, вам нужно изменить ровно столько же применений ... и если вы начнете анализировать его как long , ему, возможно, придется изменить на double (даже если это не имеет смысла для идентификаторов) ... и если вы не можете быть уверены, что анализировать String , вы не можете ничего реализовать .

Вопрос 2:

Помимо этого вопроса, у меня есть еще один: я понимаю, что статье более семи лет, поэтому может ли кто-нибудь указать мне на некоторые недавние обзоры, касающиеся объектно-ориентированного дизайна,и конкретно к идеям, касающимся прений, касающихся геттеров / сеттеров и реализации?

Листинг 1. Сотрудник: Контекст построителя


  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() );
      }

      //...
  }
11
задан wen 3 August 2011 в 13:35
поделиться