![]() |
Модераторы: LSD |
![]() ![]() ![]() |
|
ZZZkoderZZZ |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 11.3.2013 |
Мое мнение, что в ООП-программа должна содержать:
- не менее 2 классов (один класс должен наследоваться от другого) - для демонстрации принципа наследования - не менее 1 приватного члена класса - для демонстрации принципа инкапсуляции - не менее 1 виртуального метода и не менее 1 перегрузки этого метода - для демонстрации принципа полиморфизма. - не должно быть функций и переменных, не являющихся членом класса (за исключением ф-и main на С++) Может быть надо продемонстрировать что-то еще? Можно ли вот такую программу считать правильной ООП-программой?
Это сообщение отредактировал(а) ZZZkoderZZZ - 12.3.2013, 12:23 |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия |
||||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия |
теоретически можно. практически нельзя - она ничего не делает. А потом, у тебя с оформлением кода проблемы. Рекомендую не быть чукчей-писателем из известного анекдота, а почитать для начала книжки и порешать задачки из них. Список литературы есть в разделе для Новичков (в ответах на часто задаваемые вопросы). Кстати, текущее состояние твоих знаний, полное отсутствие опыта, а так же юношеский максимализм, будут препятствовать твоему поступлению на любую вменяемую работу в области программирования. |
|||
|
||||
ZZZkoderZZZ |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 11.3.2013 |
Это опять про const ? |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия |
||||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва |
вот вполне ОО программа:
тут есть объект std::cout, тип которого участвует в наследовании и имеет в своем составе подобъекты с виртуальными функциями. ему (в ОО терминологии) отправляются сообщения. в качестве сообщения отправляются объекты. для этого используются перегруженные операции (это не является обязательной частью ООП, но достойно упоминания как разновидность полиморфизма) Добавлено через 5 минут и 12 секунд ZZZkoderZZZ, ОО программа - не самоцель. ООП - инструмент, средство. никому не интересны показатели программы в виде числа классов, объектов, функций, их свойств и т.п. программа должна делать то, что должна, и быть сопровождаемой. парадигмы, библиотеки и прочие инструменты лишь средства достижения указанных целей. |
|||
|
||||
ZZZkoderZZZ |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 11.3.2013 |
Как можно лучше оформить короткую программу, которая ничего не делает? Отступы есть, скобочки расставлены по одной схеме, комментировать здесь нечего. Очень хорошо выполнены требования 6, 7 - 6. Большие функции - это зло 7. Не стоит делать функции с более чем 3-мя параметрами |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия |
ZZZkoderZZZ, публичная часть класса должна (рекомендуется) располагаться в начале, а приватная в конце. Фигурные скобки должны расставляться согласно одному правилу, а у тебя 3 метода расстановки, причем один необычный. Двоеточие при определении наследования следовало бы выделить пробелами.
|
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 |
Ну пусть хоть "Hello, world!" напечатает что ли... -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
ZZZkoderZZZ |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 11.3.2013 |
Зачем писать лишнее слово? Разработчики С++ зачем-то по-умолчанию всё сделали private, может быть по этой причине? Это сообщение отредактировал(а) ZZZkoderZZZ - 12.3.2013, 16:55 |
|||
|
||||
azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения |
По умолчанию ставится наименьшая степень доступности, чтобы помочь разработчикам избежать ошибок. Если разработчик забыл поместить метод в правильную секцию, то компилятор напомнит. А если вдруг не напомнит, значит методу самое место в приватной секции ![]()
Ну я бы сказал это вопрос вкуса, хотя лично тоже предпочитаю распологать вконце. |
||||
|
|||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия |
смысл положений публичных и приватных областей - в удобстве. Только разработчику класса интересна приватная часть. Пользователям класса (а их значительно больше, чем разработчиков, обычно) интересен именно публичный (или, реже, защищенный) раздел. Поэтому публичный следует располагать в начале, чтобы пользователь не искал его.
|
|||
|
||||
NoviceF |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 13.3.2012 Где: Ростов-на-Дону |
||||
|
||||
ZZZkoderZZZ |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 11.3.2013 |
В структуре надо дописывать private, а в классе - public. Это сообщение отредактировал(а) ZZZkoderZZZ - 12.3.2013, 19:21 |
|||
|
||||
NoviceF |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 13.3.2012 Где: Ростов-на-Дону |
||||
|
||||
Arantir |
|
|||
Рыбак без удочки ![]() ![]() Профиль Группа: Участник Сообщений: 960 Регистрация: 18.11.2012 |
Аргументы функции — это переменные, от которых зависит исходный результат функции. Функцию F = X+Y+Z нельзя сократить до F = X+Y. Вот так же и в программировании, есть случаи, в которых критически важных аргументов много. Например, функция отправки емейла в PHP. Для отправки корректного (а не похожего на спам) письма надо использовать как минимум 5 аргументов: отправитель, получатель, тема, тело и дополнительные заголовки. Можно лично для себя все это инкапсулироть в маленькую функцию, добавляя заголовки автоматически, но в корне все равно будет та же функция. Без 5 аргументов разработчикам PHP пришлось бы создать класс, геттеры и метод отправки. Или же некие другие системные функции для изменения заголовков, вставляемых в будущее письмо. В общем получилось бы неудобно и убого. В данном случае функция с 5-6 аргументами - это как раз самое оптимальное решение в плане удобства и реализации. И это только один пример. -------------------- interface Жопа { // ATTENTION: has to be implemented by every class of the project for proper project work } |
|||
|
||||
ZZZkoderZZZ |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 11.3.2013 |
Arantir,
любое число аргументов можно объединить в структуру и передать одним аргументом |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия |
Arantir, для этого существуют структуры и классы. По хорошему, для отправки письма необходимо только три параметра: адрес, тема и текст письма. Все остальное необязательно или общее для всех отправляемых писем. Именно поэтому логичнее всего объединить все это в структуру или класс.
|
|||
|
||||
Arantir |
|
|||
Рыбак без удочки ![]() ![]() Профиль Группа: Участник Сообщений: 960 Регистрация: 18.11.2012 |
ZZZkoderZZZ,
bsa, Заставлять компьютер создавать структуру на долю секунды при каждой отправке письма только ради того, чтобы это вам угодило, — не есть айс. Не приводите частное к общему. semdmail() в PHP — это функция, которая позволяет отправить корректный мейл на любом сервере, сайте, домене и при других переменных условиях. Я привел ее как пример той цели, которую она выполняет, а не как подспорье для обсуждения необязательных аргументов при отправке письма. Несомненно, для конкретного сайта или даже сервера заголовки будут настроены в угоду админу, документации, целевому получателю или звездам на небе... А для отправки регистрационного письма так и вовсе получателя и текста достаточно, остальное — константы. Я лишь привел реальный пример того, что процитированное правило далеко не является универсальным. К нему должна полагаться большая аннотация с объяснениями. В частности, про какие именно функции идет речь. Давайте возьмем, к примеру, веб-фреймворк. В нем есть контроллер, в котором, в свою очередь, есть методы, представляющие соответствующие запросы к сайту. Так что теперь, не передавать на сайт больше трех параметров в ссылке? Или метод контроллера уже не стоит считать функцией? -------------------- interface Жопа { // ATTENTION: has to be implemented by every class of the project for proper project work } |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва |
||||
|
||||
Arantir |
|
|||
Рыбак без удочки ![]() ![]() Профиль Группа: Участник Сообщений: 960 Регистрация: 18.11.2012 |
Слишком много исключений получается =)
Существует такое выражение — "слепое следование правилам"... В программировании нет правил. Есть задача и ее решение. В частности, задача может содержать и некоторые требования к коду, например, при разработке отдельной части большего приложения, иначе решение задачи, ввиду не соответствия общим чертам кода приложения, не сможет считаться решением в этом частном случае. Посмотрите в PHP. В нем огромное количество функций с количеством аргументов больше трех. Но именно это делает их применение простым и удобным. Не думаю, что вообще кто либо согласится, что создание структуры или объекта для каждого вызова подобных функций — это хорошее решение. Особенно в крупных приложениях. -------------------- interface Жопа { // ATTENTION: has to be implemented by every class of the project for proper project work } |
|||
|
||||
baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва |
Статья про оформление кода это мнение о best practices, а не свод догматов.
И вообще, тему числа параметров функции надо рассматривать в контексте конкретной задачи. А "правило трех" должно соседствовать и перекликаться с принципом "одна задача - одна функция (класс)". неудачный пример: ни язык php, ни его библиотека ни разу не системны и не стройны, увы. удобство достигается наличием разнообразных (даже чересчур) средств для решения задач, на которые php был изначально рассчитан, но не более.
а как же mysql vs mysqli? впрочем php (до последней версии) громоздок для таких описаний. а вот что-то типа
|
||||
|
|||||
Freyzer |
|
|||
![]() обаятельный нахал ![]() ![]() Профиль Группа: Участник Сообщений: 277 Регистрация: 12.12.2009 Где: на Марсе |
А в чем собственно вопрос?
-------------------- Advocatus Dei ![]() ![]() |
|||
|
||||
Arantir |
|
|||
Рыбак без удочки ![]() ![]() Профиль Группа: Участник Сообщений: 960 Регистрация: 18.11.2012 |
Суть в том, что я тоже соглашаюсь с тем, что в функции не должны быть лишних параметров, а оппозиция тоже соглашается с тем, что их число является меньшим или равным трем не во всех случаях. То есть, по сути, наши убеждения практически одинаковы. Мы просто не можем согласовать соотношение количества случаев, подпадающих под обсуждаемый тезис, и исключений из него выпадающих. -------------------- interface Жопа { // ATTENTION: has to be implemented by every class of the project for proper project work } |
|||
|
||||
krundetz |
|
|||
![]() Вечный странник ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1400 Регистрация: 14.6.2007 Где: НН(Сормово) |
||||
|
||||
Freyzer |
|
|||
![]() обаятельный нахал ![]() ![]() Профиль Группа: Участник Сообщений: 277 Регистрация: 12.12.2009 Где: на Марсе |
ZZZkoderZZZ, я тебя расстрою но, в ООПе главное не оказаться в ПОПе, если уж за это взялся. Все остальное решается чисто технически и еще, при помощи мозгов.
-------------------- Advocatus Dei ![]() ![]() |
|||
|
||||
IKM2007 |
|
|||
![]() Зима близко ![]() ![]() Профиль Группа: Участник Сообщений: 702 Регистрация: 26.4.2008 Где: olmedreca |
Зачем все усложнять и перед каждым вызовом функции заполнять структуру? А если в числе параметров большие обьекты? Иж можно передать по const& в функцию и избежать копирования. А со структурой придется использовать указатели или написать конструктор(с тем же количеством параметров) и инициализировать константные ссылки. Так чем этот подход лучше простой передачи параметров в функцию? Так ведь и программисту будет легче понять что/где/как. -------------------- "К чёрту обстоятельства, я создаю возможности." Брюс Ли |
|||
|
||||
krundetz |
|
||||
![]() Вечный странник ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1400 Регистрация: 14.6.2007 Где: НН(Сормово) |
ситуации разные бывают, но даже так если не будет структуры то будет что то другое в чем будет храниться отправляемая информация, структура или класс позволяет объединить эту информацию логически. Поэтому с этим аргументом согласиться не могу. в конструкторе должно быть ровно столько параметров, сколько требуется для инициализации, позволяющей дальше работать с экземпляром без использования сетеров.
ситуации разные бывают, если задача большая то это позволит облегчить поддержку в дальнейшем. На мой взгляд вопрос о том сколько должно быть аргументов у функции, метода или процедуры, есть полный бред. |
||||
|
|||||
SKrivosein |
|
|||
![]() Идущий в даль ![]() ![]() Профиль Группа: Участник Сообщений: 271 Регистрация: 9.6.2007 Где: Praha - Прага |
Согласен. При определённых условиях создавать отдельный обьект, только для того чтобы передать методу допустим 8 параметров, чего хорошего? Как такое облегчает лoгику программы, да и производительность тоже? |
|||
|
||||
IKM2007 |
|
|||
![]() Зима близко ![]() ![]() Профиль Группа: Участник Сообщений: 702 Регистрация: 26.4.2008 Где: olmedreca |
Если одни и те же параметры используются во многих функциях и из себя представляют что-то единое, то да. Не надо искуственно создавать классы/структуры только ради каких то чисел, если эти структуры не будут что-то осмысленное из себя представлять(то есть что-то более осмысленное чем кучка параметров). -------------------- "К чёрту обстоятельства, я создаю возможности." Брюс Ли |
|||
|
||||
krundetz |
|
||||
![]() Вечный странник ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1400 Регистрация: 14.6.2007 Где: НН(Сормово) |
1. Видимо что то не так со структурой и логикой, раз нужен объект прослойка только для передачи параметров методу(хотя не стоит забывать про шаблоны проектирования Адаптер, Прокси и Декоратор). Либо мы можем использовать этот объект в других местах, либо у нас этот метод работает как не пришей собаки хвост. Вообще все преимущество объектов и их методов, в том что первые могут хранить состояние, а вторые с этим состоянием работать. 2. Производительность разговор отдельный поэтому я его и не затрагивал. А вот логику программы наличие объектов облегчает, при условие конечно грамотного проектирования, так как объект хранит состояние и этим состоянием можно управлять через него. Ведь можно сделать так:
а можно так:
На первый взгляд второй вариант будет проще но, только до тех пор пока программа будет рисовать только одину окружность и ничего больше. Как только нужно рисовать кроме нее ещё квадрат и треугольник, да так чтобы они могли менять наложение друг на друга и передвигаться по экрану, получаем головную боль и трудно расширяемый код, если нам вдруг потребуется. Если кто мне не верит может попробовать реализовать такую программку только через функции и без использования структур( к коим относится и массив ). Если у вас получится легко расширяемая программа я с удовольствием сниму перед вами шляпу. Это сообщение отредактировал(а) krundetz - 28.3.2013, 16:53 |
||||
|
|||||
krundetz |
|
|||
![]() Вечный странник ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1400 Регистрация: 14.6.2007 Где: НН(Сормово) |
ты так говоришь, как будто эти параметры не зависят ни от чего, просто с воздуха их взяли и на бум решили что здесь применим? |
|||
|
||||
IKM2007 |
|
|||
![]() Зима близко ![]() ![]() Профиль Группа: Участник Сообщений: 702 Регистрация: 26.4.2008 Где: olmedreca |
Параметры могут быть из разных классов, никак не связанных между собой. Какой смысл взять и сунуть все в структуру если так более понятно. Получается каждой Функции по Структуре. -------------------- "К чёрту обстоятельства, я создаю возможности." Брюс Ли |
|||
|
||||
krundetz |
|
||||
![]() Вечный странник ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1400 Регистрация: 14.6.2007 Где: НН(Сормово) |
если они никак не связаны между собой но используются в одной функции или методе то это как минимум странно, возможно эта функция может быть спокойно разбита на две, так как похоже в ней выполняются одновременно два не связанных между собой действия. Если можно примерчик приведи, посмотрю что ты имеешь в виду.
Ситуации разные бывают, но если дополнительная структура действительно делает код понятнее то ее стоит использовать, даже больше если вдруг появляется желание где то использовать структуру так как это более понятно и логично, а раньше такой структуры у вас нигде не было, то у вас ошибка в проектирование. Не стоит утрировать. Это сообщение отредактировал(а) krundetz - 29.3.2013, 08:39 |
||||
|
|||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва |
вот такой пример: класс доступа к веб сервису. для его инициализации требуется
1) параметры сервера 2) параметры для вывода в лог-файл 3) параметры, связанные с задачей каждая группа параметров содержит несколько подпараметров (например, сервер: url, и информация о прокси - тип, адрес, порт, логин, пароль). как делать в этом случае? |
|||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 |
-------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
krundetz |
|
||||||||||
![]() Вечный странник ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1400 Регистрация: 14.6.2007 Где: НН(Сормово) |
DI нам в помощь, но наблюдатель будет более предпочтительным. сколько какие? вот и получается, что здесь лучше использовать несколько структур, чем кучу разрозненных параметров, никак в струкутры не объединенные на мой взгляд код вида:
более удобен, чем:
и удобнее такого:
самым оптимальным при функциональном подходе будет что то наподобие такого:
но даже в этом варианте, я вижу много минусов, так как не получиться скрыть работу с прокси, то есть если они будут не только HTTP, но и Socks, то нам придётся выносить работу с разными вариантами прокси в createConnection, вместо того чтобы подставлять разные классы прокси реализующие один интерфейс. В общем приведенный тобой пример, говорит больше в пользу ООП или хотябы структурного подхода.
Ознакомлюсь, выскажу своё мнение. Это сообщение отредактировал(а) krundetz - 29.3.2013, 10:45 |
||||||||||
|
|||||||||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва |
это те же структуры, только сбоку Добавлено через 2 минуты и 34 секунды возможно... но я не для тебя пример писал, хотелось бы мнение другой стороны услышать Добавлено через 3 минуты и 12 секунд хабр лежит уже который час |
|||
|
||||
LSD |
|
||||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin |
Бу-го-га, наш старый холивар теперь и на хабре ![]() -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
||||
|
|||||
Freyzer |
|
|||
![]() обаятельный нахал ![]() ![]() Профиль Группа: Участник Сообщений: 277 Регистрация: 12.12.2009 Где: на Марсе |
Господи, чушь какая, если что - то изучаем, обычно вопросы задаем конкретные, что явно непонятно. А тут тупая болтовня
![]() -------------------- Advocatus Dei ![]() ![]() |
|||
|
||||
IKM2007 |
|
|||
![]() Зима близко ![]() ![]() Профиль Группа: Участник Сообщений: 702 Регистрация: 26.4.2008 Где: olmedreca |
Хороший пример привел baldina, можно еше что-то такое: Например функция для добавления нового графического обьекта в конкретную сцену. Параметры:э ссылка на соответствующую сцену ссылка на хранилище данных чтобы своевременно обновить графические елементы в зависимости от поступающих данных ссылка на обьект трансформатор для перевода значении из хранилища в соответствующие значения для сцены ссылка на параметры графического обьекта получилось 4 параметра, если еще подумать, можно еще добавить. Да, программа должна быть обьектно ориентированной, но не могу понять какое отношение имеют структуры-обертки для параметров к ООП. P.S. если честно мне все равно ) -------------------- "К чёрту обстоятельства, я создаю возможности." Брюс Ли |
|||
|
||||
krundetz |
|
||||
![]() Вечный странник ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1400 Регистрация: 14.6.2007 Где: НН(Сормово) |
видимо у нас с тобой расхождение в терминологии, да и диалог о структурах больше относиться к передаче параметров методу, а не к ООП. Выше я писал следующие:
а что тогда дискутируешь? ты про что? это ж флейм! сразу не понял мне бы тоже, но видимо не судьба |
||||
|
|||||
![]() ![]() ![]() |
Правила раздела «Флейм» | |
|
Добро пожаловать в «Флейм». В разделе не действуют многие правила:
Строго запрещено:
Напоминаем о существовании волшебной кнопочки "Репорт". Если вы увидели сообщение, несовместимое с жизнью, просьба подвести на нее курсор и клацнуть левой клавишей мышки. Тем самым вы сможете призвать злого, но жутко справедливого джина-модератора, который нашлет порчу на злостного нарушителя. Кстати - счётчик сообщений здесь не растёт. Глас Винграда:
Глас Философии:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Sneg0k |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Флейм | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |