Как проектировать конструкторы в иерархии, где есть только поля, доступные только для чтения, без слишком большого количества параметров? - PullRequest
1 голос
/ 20 сентября 2010

Я разработал иерархию, каждый класс имеет 2 свойства только для чтения, сопоставленных с 2 закрытыми полями.

Каждый класс имеет cosntructor, который наследует родительский класс 1.

Проблема заключается вНа каждом уровне иерархии число параметров увеличивается на 2:

TBaseClass.Create (par1, par2);
TSubClass.Create(par1, par2, par3, par4);
TSubSubClass.Create(par1, par2, par3, par4, par5, par6);
[...]

Можно ли иметь конструкторы с 6-8 параметрами?После создания мои объекты должны быть неизменяемыми, поэтому я пытаюсь инициализировать все поля в конструкторах.

Есть ли другой метод, который вы можете предложить, или мне следует придерживаться вышеупомянутого подхода?Благодаря.

Ответы [ 3 ]

3 голосов
/ 20 сентября 2010

Пока они хорошо документированы, у меня никогда не было стигмы в отношении функций с большим количеством параметров.Так что конструктор с 8 параметрами не напугал бы меня.

Однако я могу видеть, где здесь может произойти взрыв параметров, особенно если вы начнете добавлять более 2 свойств на объект.Я также мог бы видеть неудобное распространение перегрузок конструктора, если некоторые из этих параметров могут быть по умолчанию / необязательными.

Имея это в виду, вы можете захотеть инкапсулировать сложности установки всех этих параметров с помощью конструкциишаблон. Builder приходит на ум, хотя Factory или Prototype также могут быть полезны.

1 голос
/ 21 сентября 2010

Лучше придерживаться соглашений, когда вы можете. Построитель подразумевает последовательный или множественный процесс создания объекта. Абстрактная фабрика больше подходит для создания отдельного объекта из иерархии.

Сказав это, регулярность кажется немного странной. Нужно ли SubClass3 все 6 свойств или только два? Помните, что LSP - SubClass3 должен полностью заменять BaseClass, поэтому на каждом уровне новый предок принимает на себя ответственность за весь набор, который обычно больше, чем просто передача их обратно через конструкторы.

0 голосов
/ 23 сентября 2010

Почему вы не позволяете этим свойствам быть доступными для записи и защищаете объект, передавая его в интерфейс? Как это:

type
  IMyObject = interface
    function GetProperty1(): integer;
    function GetProperty2(): boolean;
  end;

  TMyObject = class(TInterfacedObject, IMyObject)
  public
    constructor Create();
    function GetProperty1(): integer;
    function GetProperty2(): boolean;
    procedure SetProperty1(Value: integer);
    procedure SetProperty2(Value: boolean);
  end;

function CreateMyObject: IMyObject;
var obj: TMyObject
begin 
  obj := TMyObject.Create;
  obj.SetProperty1(45);
  obj.SetProperty2(false);
  Result := obj;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...