SS>Всем привет.
SS>Какой из вариантов более предпочтителен с точки зрения "тру" ООП? И почему?
SS>Класс Source содержит только одно свойство "Products".
Тогда это не Source, а List<Product>.
foreach (Product p in LoadProductsFromFile(path))
и никакой Source не нужен. (Потому что если там метод LoadFromFile, то о каком ООП вообще идёт речь?)
Re[2]: ООП: инициализация в конструкторе VS статический мето
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 статический метод
SS>Какой из вариантов более предпочтителен с точки зрения "тру" ООП? И почему?
Я думаю тут ответ прост — в мире "тру" ООП статических методов не существует.
В жизни, однако, мы нередко руководствуемся соображениями практичности а не концептуальной чистоты.
Re: ООП: инициализация в конструкторе VS статический метод
Здравствуйте, pagrus, Вы писали:
P>Я думаю тут ответ прост — в мире "тру" ООП статических методов не существует. P>В жизни, однако, мы нередко руководствуемся соображениями практичности а не концептуальной чистоты.
Думаю, в мире "тру" ООП все является объектом, включая даже классы (ага, они синглтоны).
А "статические методы" — это их (классов) "просто методы".
Re[2]: ООП: инициализация в конструкторе VS статический мето
Здравствуйте, 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) а если не вызвать ни разу?