|
Registered User
Сообщений: 120
Проживание: Хельсинки
Регистрация: 08-08-2005
Status: Offline
Репутация: 0
|
Цитата:
|
Сообщение от zuber
Ну, Ц++ у менаы на очень среднем уровне, т.к. я не часто его использую. Любая критика из велкам - больше буду знать. Один конструктор означает, что цлиент цласса не может создать обьект не передавая никаких параметров. ИМХО, может быть очень надоедливой фичей, если учесть, что там будет оператор "=".
Ну, вроде один простой (цаст) делает из цонста нецонст  .
ну, там в задаче, вроде, стринга была  . А так, человеку еше один класс надо было бы писать.
Ну, елси мы породим другой калсс, то он будет иметь собственный деструктор который будет уничтожать цирковые качества и передавать управление деструктору супер-класса. Или я чего-то не понял?
Ну, здесь соглашусь, что резатель строк может быть другим классом. Хотя, валидаор на все свойства собаки не есть еффективно. Если, например, вы хотите изменить только имя, то зачем валидатору проверять вся остальное?
В данном случае, резатель строк просто обшая функциональность, которая должна присутствовать в двух сет методах. Может, по стилю, оно и не правильно, но количества кода для данной простой операции гораздо меньчше. ИМХО, сложность десигна должна соответствовать задаче. Если мы знаем, что дальше "Собака" дело не пойдет, то можно слегка прогнуть ООП правила. Плюс, человек не может разглядеть резатель даже в моем коде, а, представьте, френдов и виртуальные функции

|
Очень рад адекватному восприятию критики!
Отвечаю на Ваши комментарии:
1.cast из const не const делает или нет - меня совершенно не интересует, потому что я этим никогда не воспользуюсь. Если делает - это большая глупость. И если возникла в этом надобность - причина кроется в плохом дизайне. Исправьте дизайн, и не понадобится на лету превращать муху в слона, и говорить, что так оно и было
2. Порода в задаче стояла как string. Без комментариев. Если задача такая, то решение должно быть адекватно задаче. Не надо воротить супер пупер, если всё просто. Нет возражений у меня, убедили. Но, в качестве комментария к решению - это (моё предложение) бы покатило, и ещё как...
3. Вы похоже не полностью понимаете преимущества ООП, а именно самой мощной его парадигмы - полиморфизма. Деструктор должен быть виртуальным для того, чтобы уничтожить объект по ссылке на родительский класс. Вы произведёте на свет ЦирковуюСобаку, затем отправите её на Выставку, передав её туда ссылкой или указателем на Собаку, потому что Выставка будет учитывать именно Собак, а не создавать свой список для каждого подвида Собак. Затем, когда Выставка закроется, она "уничтожит" всех Собак, одним списком, вызывая деструкторы Собак, а не пытаясь разобраться что это за конкретный подвид, и затем вызывать в case деструктор именно для этого класса.
Перечитайте про полиморфизм и виртуальные функции.
4. валидатор-инвариант - это безопасный подход. Причём Валидатор может быть публичным - пусть и клиенты убедятся, что собака правильная, если им это нужно. И именно все поля, правильнее говоря и не поля, а состояние объекта, в общем случае оно не только поля, но и отношение этих полей друг к другу и к состоянию вызвавшего контекста. Вот реализация Валидатора будет сокрыта, и будет инкапсулировать все детали определения правильной собаки. Если же писать оптимальный код в ущерб безопасному - сами с опытом убедитесь что результат обратный получится. Если клиент будет убеждаться в правильности собаки сам, вы добавите/уберёте какие то свойства пса, и все - кранты, клиент падает, потому что валидейтит что то не в синхроне с вашей улучшенной собакой.
5. Резатель в Собаке - это неверно. Резатель - это утилита обработки строк, ну нафига козе баян? Может для такой учебной задачи и сойдёт, но согласитесь: как нас учат, так мы и делаем в будущем, на реальных проектах. Уж лучше сразу сложно, но правильно, ИМХО. Если лень писать класс, ну сделайте его хоть глобальным, но никак не пришивайте бедной Собаке...
Удачи.
|