ООП: инициализация в конструкторе VS статический метод
От: super-super Россия  
Дата: 23.03.12 14:59
Оценка:
Всем привет.

Какой из вариантов более предпочтителен с точки зрения "тру" ООП? И почему?

Source src = new Source(filePath);
foreach (Product p in src.Products) {
  ....
}


VS


Source.LoadProductsFromFile(filePath);
foreach (Product p in src.Products) {
  ....
}


Класс Source содержит только одно свойство "Products".
Re: ООП: инициализация в конструкторе VS статический метод
От: Lloyd Россия  
Дата: 23.03.12 15:03
Оценка:
Здравствуйте, super-super, Вы писали:

SS>Какой из вариантов более предпочтителен с точки зрения "тру" ООП? И почему?


Более кашерно так:
foreach (Product p in Source.ReadProductsFromFile(fileName))


Re: ООП: инициализация в конструкторе VS статический метод
От: Temoto  
Дата: 23.03.12 16:43
Оценка:
SS>Всем привет.

SS>Какой из вариантов более предпочтителен с точки зрения "тру" ООП? И почему?


SS>Класс Source содержит только одно свойство "Products".


Тогда это не Source, а List<Product>.

foreach (Product p in LoadProductsFromFile(path))


и никакой Source не нужен. (Потому что если там метод LoadFromFile, то о каком ООП вообще идёт речь?)
Re[2]: ООП: инициализация в конструкторе VS статический мето
От: super-super Россия  
Дата: 23.03.12 17:02
Оценка:
Здравствуйте, Temoto, Вы писали:

T>Тогда это не Source, а List<Product>.


T>
T>foreach (Product p in LoadProductsFromFile(path))
T>


T>и никакой Source не нужен. (Потому что если там метод LoadFromFile, то о каком ООП вообще идёт речь?)


Да, класс Source, действительно, содержит метод LoadFromFile.
Почему предлагаете отказаться от Source?
Re[3]: ООП: инициализация в конструкторе VS статический мето
От: Temoto  
Дата: 23.03.12 17:14
Оценка:
T>>Тогда это не Source, а List<Product>.

T>>
T>>foreach (Product p in LoadProductsFromFile(path))
T>>


T>>и никакой Source не нужен. (Потому что если там метод LoadFromFile, то о каком ООП вообще идёт речь?)


SS>Да, класс Source, действительно, содержит метод LoadFromFile.

SS>Почему предлагаете отказаться от Source?

Два пункта.
1) Класс с одним методом это не ООП. Это функция. Если метод статический, то это простая функция, как в Си. Если метод инстанциируемый, то это функция замкнутая на аргументы конструктора. Если язык позволяет описывать функции вне классов, то зачем писать больше?
2) Название Source намекает на какую-то обобщённость источника продуктов, на абстракцию загрузки. Но метод называется Load *FromFile*, обобщённость порушена на корню. Это тоже не ООП. Вот если бы вы сделали интерфейс IProductSource и класс FileProductSource(IProductSource) и у него метод Load... совсем другое дело. Но тут этого нет.
Re: ООП: инициализация в конструкторе VS статический метод
От: pagrus  
Дата: 24.03.12 08:57
Оценка:
SS>Какой из вариантов более предпочтителен с точки зрения "тру" ООП? И почему?

Я думаю тут ответ прост — в мире "тру" ООП статических методов не существует.
В жизни, однако, мы нередко руководствуемся соображениями практичности а не концептуальной чистоты.
Re: ООП: инициализация в конструкторе VS статический метод
От: Ronaldo 9  
Дата: 26.03.12 03:51
Оценка:
Здравствуйте, super-super, Вы писали:

SS>Всем привет.


SS>Какой из вариантов более предпочтителен с точки зрения "тру" ООП? И почему?


Можно так:
Source src = new Source();
SourceProvider prv = new FileSourceProvider();
prv.Fill(src);
foreach (Product p in src.Products) {
  ....
}
Re[2]: ООП: инициализация в конструкторе VS статический мето
От: artelk  
Дата: 26.03.12 10:51
Оценка:
Здравствуйте, pagrus, Вы писали:

P>Я думаю тут ответ прост — в мире "тру" ООП статических методов не существует.

P>В жизни, однако, мы нередко руководствуемся соображениями практичности а не концептуальной чистоты.

Думаю, в мире "тру" ООП все является объектом, включая даже классы (ага, они синглтоны).
А "статические методы" — это их (классов) "просто методы".
Re[2]: ООП: инициализация в конструкторе VS статический мето
От: artelk  
Дата: 26.03.12 11:05
Оценка:
Здравствуйте, Ronaldo 9, Вы писали:

R9>Можно так:

R9>
R9>Source src = new Source();
R9>SourceProvider prv = new FileSourceProvider();
R9>prv.Fill(src);
R9>foreach (Product p in src.Products) {
R9>  ....
R9>}
R9>


Выскажу свое сугубо личное мнение (возможно, противоречащее "тру" ООП): не нравится, когда программируют в терминах "последовательности инструкций по изменению внутренних состояний объектов" — особенно в случае, когда этого можно легко избежать.
Плюс по коду возникают вопросы: 1) что будет если Fill вызвать 2 раза? 3) а если у разных провайдеров, но для одного соурса? 3) а если не вызвать ни разу?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.