|
Wanna be serious
587 / 474 / 186
Регистрация: 31.07.2013
Сообщений: 1,693
|
||||||||||||||||||||||||||||||||||||
На сколько соответствует код концепции ООП19.12.2015, 06:00. Показов 1109. Ответов 14
Метки нет (Все метки)
Доброго времени суток форумчане. Я понимаю что вопрос может звучать глупо, но мне это важно знать.
Суть вопроса вот в чем. Есть стандартное задание: описать класс Student. Я в общем так и сделал, и подкрутил ещё пару контекстных действий для работы с некой базов данных. Но теперь возник вопрос, на сколько код соответствует концепции ООП? Не написал ли я программу в виде "процедурное программирование в классах"? И если это так, то на сколько идёт перекос в сторону ООП или в сторону процедурного программирования? Заранее спасибо всем откликнувшимся ![]() Код
Main.cpp
Student.cpp
Student.h
Check.cpp
Check.h
Select.cpp
Select.h
0
|
||||||||||||||||||||||||||||||||||||
| 19.12.2015, 06:00 | |
|
Ответы с готовыми решениями:
14
На сколько приведенный код неправильный с точки зрения ООП? Соответствует ли код стандарту? |
|
542 / 163 / 79
Регистрация: 23.09.2013
Сообщений: 316
|
|||
| 19.12.2015, 07:18 | |||
|
Bespridelschic, чтож, для того чтобы формально ответить на данный вопрос, обратимся к википедии:
ООП:
Ваши слова
В ООП каждый класс рассматриваемый в контексте использования предполагает определенную смысловую нагрузку. Это некоторый набор данных и методов по работе с ними, которые были объединены в одну согласованную сущность. Сокрытие данных от прямого изменения в сочетании с методами - позволяет инкапсулировать две вещи - способ представления данных (внутри класса мы вольны изменять представление как нам вздумается) и алгоритмы обработки данных (внутри класса мы можем изменять реализацию методов при этом вызывающая сторона этого не должна замечать). В целом это наделяет классы важным и полезным свойством - за счет инкапсуляции достигается возможность скрыть сложность и конкретику реализации за границами класса - его публичным интерфейсом. И во вне работать с объектами класса как с согласованной абстракцией. (У С. Макконела в книге Совершенный Код на эту тему приводится характерный пример - инкапсуляция позволяет представить огромный особняк в виде простого, абстрактного чертежа здания - с крышей, стенами, дверью и трубой, при этом не позволяя стороне, которая использует наш упрощенный домик - увидеть а из чего сделана дверь, а из какого материала у двери ручка и т.д.) При этом за этой абстракцией - скрыта вся сложность реального здания. Полиморфизм приносит возможность расширения единственной абстракции на целое множество - за счет полиморфного изменения поведения в зависимости от того, какой наследник реально был создан. Наследование, особенно в с++ жестко завязано с полиморфизмом на уровне классов (если не брать в расчет указатели на функции - единственный способ получить полиморфное поведение - наследование от класса с виртуальным методом. Кроме того наследование - позволяет расширять существовавшее поведение класса, добавляя дополнительные свойства и повышая тем самым универсальность без дублирования кода (наследование реализации). Про ООП написаны целые книги, я не хотел бы тут их целиком переписывать, в чем основная мысль, применительно к Вашей программе? В том, что всего этого могучего механизма при помощи которого люди научились создавать сложнейшие системы в Вашем коде не используется. Я попробую выделить несколько концепций, которые могли бы быть реализованы для приближения кода к ООП стилю. То что творится в мейне - могло быть выделено в отдельный класс программы, который в конструкторе принимал бы все необходимые ресурсы для настройки и у которого был бы единственный метод - Execute, в main осталось бы создание конкретных объектов, передача их в Programm и вызов метода Execute. Если посмотреть на Ваше общение с пользователем (Ваша программа использует интерфейс командной строки) - а кроме командной строки могло быть получение информации из графического интерфейса пользователя, могло быть получение данных от клиента по сети, могла быть автономная работа с получением данных из файла скрипта (например для интеграционного теста по сценарию) - таким образом мог быть сделан класс (абстрактный, образующий интерфейс с методами без реализации - который позволял бы отображать некоторые сообщения, запрашивать ответы от пользователя, соответственно мог быть создан класс - реализация, который осуществлял бы общение через потоки (заметьте не через конкретные cin и cout, а через потоки вообще) который бы получал в качестве аргументов конструктора конкретные потоки, которые нужно использовать. (Во всех других местах программы никаких прямых вызовов cin и cout не осталось бы). Можно было бы создать класс меню, в который можно было бы регистрировать пункты меню (объекты еще одного класса) и который бы умел их отображать в средство отображения с демонстрацией текста меню и номера в списке. В зависимости от выбранного пользователем варианта - меню бы вызывало из зарегистрированного объекта - команду (см. шаблон команда). Из студента должны были бы уйти все вычисления связанные с обработкой статистики студентов (ваши Show_) - для их реализации создан был бы отдельный класс подсчета статистики. Возможно стоило бы создать еще и класс факультета или вуза, для обработки коллекций студентов. Это разбиение я выполнил исходя из 1) возможности разнообразного использования программы в разных контекстах (выделение классов вывода и получения значений от пользователя) 2) мыслей об универсальности элементов и их повторного использования (класс меню с возможностью динамического расширения) 3) Мысли о сущностях реального мира (Студент, Факультет, Статистика) Как можно было бы дополнительно удостовериться в правильности разбиения? Во-первых можно попытаться проанализировать, соответствуют ли классы в программе принципам SOLID и во-вторых, можно было бы разрабатывать программу в методологии TDD , задаваясь вопросом - а как я смогу извне проверить тот или иной фрагмент кода, что является существенным поведением, а что деталью реализации и представления. ООП в целом и его реалии в с++ в частности - громадная и интереснейшая тема, освоив которую программист становится способен создавать по-настоящему гибкие, расширяемые и модульные программы, надеюсь Ваше стремление к его освоению не угаснет перед лицом трудностей на пути. А соответственно и моё длиннющее сообщение не окажется написанным зря.
2
|
|||
|
Wanna be serious
587 / 474 / 186
Регистрация: 31.07.2013
Сообщений: 1,693
|
|
| 19.12.2015, 08:52 [ТС] | |
|
Melg, спасибо вам огромное за столь развернутый ответ. Я учту свои ошибки, и буду обращаться к вашему ответу при дальнейшем изучении C++, для более точного понимания.
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||
| 19.12.2015, 13:07 | ||||||||
|
дальше не читал. парадигма - система взглядов и способов абстрагирования. оо-парадигма - парадигма, при которой программист может рассматривать конструкции на языке, как сущности, наделенные свойствами и умениями. пример:
сущность наделенную свойствами и умениями? вот он умеет например, показать инфу о себе. если да, значит вы смотрите на код сквозь призму объектно ориентированной парадигмы. а сам код написан так, что у вас есть такая возможность. что касается наследований/полиморфизмов - все это очень здорово, и является признаками "развитого ооп". но не являются необходимостью для оо-программирования.
1
|
||||||||
|
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
||
| 19.12.2015, 13:33 | ||
|
Bespridelschic, безотносительно парадигм к коду есть как минимум пара серьезных замечаний. 1. Бо́льшая часть классов содержит исключительно статические методы. Значит, в этих случаях классы как таковые не нужны. Хватило бы функций, объединенных в пространстве имен. 2. В класс Student жестко зашит весь ввод-вывод, что сильно ограничивает возможности его использования. В реальной системе данные для объекта могут прийти из множества источников: файлы, сеть, база данных. Аналогично и с выводом. Следовательно, взаимодействие с внешним миром лучше выносить отдельно. PS Уже после написания я увидел, что на это указывали во втором посте. Но в посте такого объема суть теряется.
1
|
||
|
Wanna be serious
587 / 474 / 186
Регистрация: 31.07.2013
Сообщений: 1,693
|
|
| 19.12.2015, 13:43 [ТС] | |
|
0x10, спасибо за разъяснения. Я пока что учусь всему этому, а пока учусь - стараюсь отработать полученные знания в каких-нибудь более менее полезные программах.
0
|
|
|
15 / 15 / 1
Регистрация: 26.01.2015
Сообщений: 82
|
|
| 13.01.2016, 10:36 | |
|
Я не увидел у тебя реализации инкапсуляция, скрытие свойств, в учебниках говориться что в ООП обращение
к свойствам идет через сеттеры и геттеры, чтобы защитить данные извне.
0
|
|
|
Wanna be serious
587 / 474 / 186
Регистрация: 31.07.2013
Сообщений: 1,693
|
||
| 13.01.2016, 10:41 [ТС] | ||
|
0
|
||
|
15 / 15 / 1
Регистрация: 26.01.2015
Сообщений: 82
|
||||||
| 13.01.2016, 10:51 | ||||||
|
Там все очень просто, вот твой класс
public методов, меняющие поведение этих свойст, т.е. будет public set_age(int age) { this.age=age; } public get_age() { return this.age } ...
0
|
||||||
|
Wanna be serious
587 / 474 / 186
Регистрация: 31.07.2013
Сообщений: 1,693
|
|
| 13.01.2016, 10:55 [ТС] | |
|
ShkrylAndrei, подходит ли перегруженная operator >> () по сеттер, и перегруженная operator << () под геттер?
0
|
|
|
Модератор
3136 / 2283 / 469
Регистрация: 26.03.2015
Сообщений: 8,886
|
|
| 13.01.2016, 16:23 | |
|
0
|
|
|
Wanna be serious
587 / 474 / 186
Регистрация: 31.07.2013
Сообщений: 1,693
|
|||||||||||
| 13.01.2016, 16:38 [ТС] | |||||||||||
|
Shamil1, В таком случае, не могли бы вы продемонстрировать как в моём случае применить сеттеры/геттеры, на основании кода приёма/вывода данных (т.е. ввод всей необходимой для объекта информации)?
operator >> ()
operator << ()
0
|
|||||||||||
|
Модератор
3136 / 2283 / 469
Регистрация: 26.03.2015
Сообщений: 8,886
|
||||||
| 13.01.2016, 17:19 | ||||||
0
|
||||||
|
Wanna be serious
587 / 474 / 186
Регистрация: 31.07.2013
Сообщений: 1,693
|
|
| 13.01.2016, 17:23 [ТС] | |
|
Shamil1, т.е. в методах для каждого поля класса должен быть прописан свой сеттер/геттер? Прошу прощения если я задаю чересчур много вопросов, просто хочу разобраться с этим всем.
0
|
|
|
Модератор
3136 / 2283 / 469
Регистрация: 26.03.2015
Сообщений: 8,886
|
||
| 13.01.2016, 18:35 | ||
|
1. К которым нужен доступ из вне (на чтение и/или запись) 2. Доступ только "изнутри", но, например, есть какие-то условия, которые нужно проверять при каждом обращении (например, при записи Возраст проверять, что он не отрицательный)
1
|
||
| 13.01.2016, 18:35 | |
|
Помогаю со студенческими работами здесь
15
Точно ли код соответствует условию задачи? Соответствует ли код условиям задачи (внутри)? Средний радиус яйца домашней курицы 5 см, а инкубаторной – 4 см. Сколько инкубаторных яиц соответствует де Исходный код, который соответствует ассемблерному коду Средний радиус яйца домашней курицы 5 см, а инкубаторной – 4 см. Сколько инкубаторных яиц соответствует десятку домашних? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536
Одним из. . .
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|