Как практиковать объектно-ориентированное программирование? [закрыто]

13

Я всегда программировал на процедурных языках, и в настоящее время я двигаюсь к объектной ориентации. Основная проблема, с которой я столкнулся, заключается в том, что я не вижу способа эффективно практиковать объектную ориентацию. Я объясню свою точку зрения. Когда я изучал PHP и C, было довольно легко практиковаться: нужно было просто выбрать что-то и подумать над алгоритмом для этого.

Например, в PHP было просто сесть и подумать: «Ну, просто на практике, позвольте мне создать одно приложение с областью администрирования, где люди могут добавлять продукты». Это было довольно легко, нужно было придумать алгоритм регистрации какого-либо пользователя, авторизации пользователя и добавления продуктов. Сочетая их с возможностями PHP, это был хороший способ попрактиковаться.

Теперь в объектной ориентации у нас много дополнительных вещей. Это не просто вопрос об алгоритме, а более глубокий анализ требований, написание сценариев использования, вычисление диаграмм классов, свойств и методов, настройка внедрения зависимостей и многое другое.

Главное, что в том, как я изучал ориентацию на объекты, кажется, что хороший дизайн имеет решающее значение, тогда как в процедурных языках достаточно одной смутной идеи. Я не говорю, что на процедурных языках мы можем написать хорошее программное обеспечение без дизайна, просто для практичности это возможно, в то время как в объектной ориентации кажется невозможным обходиться без хорошего дизайна, даже для практики.

Это кажется проблемой, потому что если каждый раз, когда я собираюсь попрактиковаться, мне нужно выяснить тонны требований, вариантов использования и так далее, то, похоже, это не очень хороший способ стать лучше в ориентации объекта, потому что это требует у меня есть одна целая идея для приложения каждый раз, когда я собираюсь практиковать.

Из-за этого, каков хороший способ практиковать объектную ориентацию?

user1620696
источник
1
В первые годы обучения в университете прекрасным введением в ООП была книга Брюса Экеля «Мышление на Яве». Это было рекомендовано как для новичков в программировании, так и для людей, имеющих опыт процедурной разработки - возможно, это поможет вам.
Ивайло Славов
3
PHP является объектно-ориентированным; ты просто не использовал его. php.net/manual/en/language.oop5.php
Роберт Харви
Вы можете просто снова реализовать то же приложение, используя подход ООП. В конце концов, это всего лишь инструмент. Рекомендация снизу иметь книгу GOF и попытаться переосмыслить существующий процедурный код объектно-ориентированным способом также может быть хорошей практикой.
JensG
Создавайте маленькие игры (без графики), карточные игры или аналогичные в начале, попробуйте повторно использовать классы в этих играх. stackoverflow.com/questions/1301606/…
grizwako

Ответы:

20

Теперь в объектной ориентации у нас много дополнительных вещей.

Нет, ты не ...

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

Ничего из этого не нужно для практики объектно-ориентированного программирования.

Это было довольно легко, нужно было придумать алгоритм регистрации какого-либо пользователя, авторизации пользователя и добавления продуктов.

Все объектно-ориентированное программирование вместо того, чтобы думать об алгоритмах для выполнения этих шагов, вы думаете о том, какие объекты необходимы для выполнения этих шагов - какую функциональность вы хотите, какое состояние необходимо для этого, и какой интерфейс вы хотите показать пользователю. Так же, как вы должны делать в процедурном программировании.

Единственное отличие состоит в том, что вместо того, чтобы сосредоточиться на функциях, которые вам нужны, и на том, как они работают, вы сосредотачиваетесь на том, как функциональность и состояние сгруппированы по обязанностям и как эти обязанности взаимодействуют.

Как практиковаться? Точно так же, как вы практикуете процедурное программирование: выберите проблему и решите ее, используя связки классов. Выясните, как это отстой, повторите с извлеченными уроками.

Telastyn
источник
3
+1 "Выясни, как это отстой" Вот как я пишу код: наполнен стыдом и ненавистью к себе ... всегда борюсь за то, чтобы извлечь уроки из предыдущих проектов.
WernerCD
1
Мне нравится подход. Вместо того, чтобы слишком усложнять и пытаться выучить все сразу, начните с более мелких шагов и повторяйте применение всех полученных знаний.
СуперМ
6

Хороший вопрос. Конечно, вы говорите, что практика ООП на самом деле означает практиковать все эти вещи (анализ требований, варианты использования, шаблоны проектирования и т. Д.), Что верно и на первый взгляд может показаться утомительным.

Мой совет - начать практические занятия, помня о двух вещах: разработка через тестирование и принцип единой ответственности .

Затем просто начните, как вы это делали с PHP / C: придумайте идею, подумайте, что вам нужно для этого, и реализуйте эти вещи один за другим. Однако имейте в виду, что вам нужно начинать с тестов (что вынуждает вас определять надлежащие интерфейсы, поскольку в противном случае тестируемость сразу же страдает) и что TDD подразумевает цикл красно-зеленого-рефакторинга. Другими словами, у вас есть чуть-чуть функциональности, и как только он заработает, вы реорганизуетесь, чтобы получить правильный ОО-дизайн, если вы не сделали его с самого начала (чего не будет).

При выполнении этого шага рефакторинга всегда напоминайте себе о SRP. Если вы добавили вторую ответственность к своему объекту, пришло время создать что-то новое.

Когда вы будете развиваться таким образом, вы должны знать, что ваше окончательное решение будет сильно отличаться от того, с чего вы начинаете. Ваша кривая обучения также будет довольно крутой. Например, вы не узнаете, что такое шаблон Factory, но вместо этого вы поймете необходимость чего-то, что создает экземпляры вашего класса различными способами. Так что, если вы вообще не слышали об объектно-ориентированных шаблонах проектирования, хорошо бы немного прочитать о них параллельно.

Фрэнк
источник
1
Таким образом, в основном вы говорите «учиться TDD и GOF»
Роберт Харви
3

Если вы только начинаете в ООП, вы можете развлечься и «потренироваться» в автономном режиме, взглянув практически на любую реальную систему и подумав, что это за объекты и каковы отношения между ними, какие методы / интерфейсы они могут поддерживать как бы вы представляли их в иерархии классов и как набор экземпляров объектов и каковы будут отношения владения объектами и т. д. (примечание: я вообще не упоминаю слово «алгоритмы» в приведенном выше). Нарисуйте много диаграмм (изучите немного UML или аналогичный), прежде чем думать о кодировании.

Это поможет вам лучше понять отношения IS-A и HAS-A , которые, вероятно, являются наиболее важной классификацией в любом проекте ООП (и, несмотря на это, кажется, что многие опытные программисты на ООП по-прежнему сталкиваются с этим ). Если вы овладеете IS-A / HAS-A, вы также получите IS-IMPLEMENTED-IN-TERMS-OF (которую я также видел описанной как IS-KIND-OF-A: ^)

Серьезно, в следующую поездку в супермаркет, просто представьте, что кто-то поручил вам написать симулятор ООП этого места ...

timday
источник
Если вы пишете программное обеспечение, которое поможет биологам отслеживать тигров, помеченных радио, то тот факт, что тигр - это животное и имеет полоски, не имеет значения и не будет отражен в программном обеспечении. Но если вы подумаете о тигре в абстрактном смысле и с точки зрения «есть и есть», это то, что вы получите.
Майкл Шоу
1
Но именно поэтому я предлагаю такое упражнение, потому что должно быстро стать очевидным, что тигры и полосы не имеют отношения к хорошему решению, в то время как такие вещи, как, например, отслеживание координат происходит с (угадывание) GPS, инерционная нагигация или радиотриангуляция, могут будь то вещь, которую должен захватывать дизайн ООП трекера. Когда я говорю «взглянуть на систему реального мира», я имею в виду выход за пределы чисто физических атрибутов. например, в симуляторе супермаркета обязательно должны быть включены более абстрактные понятия, такие как «очереди», а не только очевидные «тележки» и «покупатели».
Timday
1

То, что я помню со времен C (в далеком прошлом), мы использовали для разделения функций и процедур на разные файлы в зависимости от их ответственности. Я не утверждаю, что это идеально или что-то в этом роде, но это было хорошей отправной точкой, когда я фактически начал программировать на объектно-ориентированных языках. Поэтому, возможно, вы могли бы начать с преобразования файлов в объекты.

Что касается ООП, то все дело в практике и стремлении к улучшению. Редко кто-то понимает это с нуля. Таким образом, итерации происходят в течение всего жизненного цикла проекта.

Владимир Кочанчич
источник
0

Давайте добавим терминологию, объектно-ориентированный анализ и объектно-ориентированное проектирование , как это сделал Питер Коад в 1990-х годах.

Вместе они формируют дисциплину разработки программного обеспечения OOAD, которая может (сделано правильно) поддерживать программиста в момент написания и тестирования кода. В этом случае объектно-ориентированное программирование может иметь свой уровень детализации, умелое использование возможностей языка программирования для удовлетворения функциональных целей и требований дизайна, определенных на уровне проекта.

Иногда это проект с одним человеком, и тогда вы должны носить все шляпы (но не обязательно все одновременно). Я большой поклонник тестовой разработки для своих личных проектов (см. Рекомендацию Фрэнка), но это касается не только объектно-ориентированной разработки программного обеспечения.

В командном проекте хорошее разделение обязанностей является ключом к успешной реализации. Умелое использование шаблонов объектно-ориентированного проектирования помогает коллективному пониманию, ограничивая видимые интерфейсы, необходимые для анализа, каналов данных и бизнес-логики, для совместного использования удобной среды.

hardmath
источник
0

«Ну, просто на практике, позвольте мне создать одно приложение с областью администрирования, где люди могут добавлять продукты». Это было довольно легко, нужно было придумать алгоритм регистрации какого-либо пользователя, авторизации пользователя и добавления продуктов.

Почему бы не сделать то же самое только на этот раз с объектами пользователя и объектами продукта? Также, если вы используете язык, который поддерживает как процедурный, так и ОО, то вы можете попытаться реализовать объекты на основе стандартной процедурной библиотеки, например, файловый объект.

stonemetal
источник