Как я могу лучше практиковать объектно-ориентированное программирование?

Я программировал в объектно-ориентированных языках уже много лет, но втайне я смотрю на некоторые вещи, которые мои коллеги делают с завистью. Многие из них, похоже, обладают внутренним инстинктом ОО, которого у меня нет - как бы я ни старался. Я прочитал все хорошие книги по ОО, но по-прежнему не могу их взломать. Я чувствую себя парнем, который дал 110% быть профессиональным футболистом, но у него не было естественного таланта. Я в недоумении и думаю о переключении профессий - что мне делать?

Ответ 1

Я бы сказал, что больше не сосредотачиваюсь на программировании OO и больше ориентируюсь на дизайн OO. Возьмите бумагу и карандаш (или, возможно, инструмент моделирования UML), и уйдите с экрана.

Практикуя, как разработать систему, вы начнете ощущать естественные отношения с объектами. Код является лишь побочным продуктом дизайна. Нарисуйте диаграммы и смоделируйте свое приложение в чисто некодовой форме. Каковы отношения? Как взаимодействуют ваши модели? Даже не думайте о коде.

Как только вы потратили время на проектирование... затем переведите его в код. Вы будете удивлены тем, насколько быстро код может быть написан с хорошего дизайна OO.

После большой практики проектирования вы начнете видеть общие области, которые могут быть модулированы или абстрагированы, и вы увидите улучшение как в ваших проектах, так и в вашем коде.

Ответ 2

Самый простой способ - изучить такие понятия, как SOLID, DRY, FIT, DDD, TDD, MVC и т.д. Когда вы посмотрите на эти акронимы, это приведет вас к множеству других кроличьих ям, и как только вы закончите с чтением должен хорошо понимать, что лучше объектно-ориентированного программирования!

SOLID podcasts: http://www.hanselminutes.com/default.aspx?showID=168, http://www.hanselminutes.com/default.aspx?showID=163

SOLID breakdown: http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod

DRY: http://en.wikipedia.org/wiki/Don%27t_repeat_yourself

FIT: http://www.netwellness.org/question.cfm/38221.htm

DDD: http://dddcommunity.org/

Требуется DDD чтение: http://www.infoq.com/minibooks/domain-driven-design-quickly

TDD: http://en.wikipedia.org/wiki/Test-driven_development

MVC: http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

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

Ответ 3

Мое предложение было бы узнать что-то другое.

Изучите функциональное программирование и примените то, что вы узнаете от этого, к ООП. Если вы знаете С++, поиграйте с общим программированием.

Изучите не-объектно-ориентированные языки.

Не только потому, что вы должны использовать все эти вещи (вы должны), либо потому, что они должны полностью заменить ООП (они, вероятно, не должны), а потому, что вы также можете применять уроки от них к ООП.

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

Слепо пытается применить ООП или стремиться писать лучший код ООП, как правило, приводит к огромным перегруженным беспорядкам с слишком большим количеством уровней абстракции и косвенности и очень мало гибкости.

Не пытайтесь писать хороший код ООП. Попробуйте написать хороший код. И используйте ООП, когда это способствует этой цели.

Ответ 4

Во многих полях есть "эврика", где все происходит вместе.

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

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

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

Ответ 5

Слишком много людей думают о кодировании сначала, объекты, последние.

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

  • Вот несколько методов, которые помог мне: когда вы вдали от работать и открывать, вы можете , рассматривая все как объект. Не смотрите на эти объекты и интересно, как вы собираетесь для их программирования, посмотрите на них как только свойства и функции как они соотносятся или наследуются от каждого Другие. Например, когда вы видите человека, они являются объектом и поэтому будет представлять класс. У них есть такие свойства, как волосы цвет, тон кожи, высота и т.д. Они выполняют определенные функции. Oни ходить, разговаривать, спать и т.д. Некоторые из функции, которые люди возвращают Результаты. Например, их рабочие функция возвращает сумму в долларах. Вы можете сделать это со всем, что вы потому что все это объект. Велосипед, автомобиль, звезда и т.д.

  • Перед тем, как закодировать проект, используя пост-заметки и сухую стирание . Это сделает хорошую практику пока вы не получите это. Подумайте о своих конкретных объект/функция/свойство. Каждый из эти предметы будут иметь свои собственные post-it note. Поместите их как иерархии на доске с сухим стиранием. В в этом отношении функция/свойства будут помещены под объект. Если у вас есть другой объект, делайте то же самое для этого. Тогда спросите себя, сделайте любой из этих сообщений он отмечает (объекты/функция/свойство) связаны друг с другом. Если два объекта использовать ту же функцию, создать родительский объект (post-it note) и put он выше других с функция многократного использования под новым заметка. Нарисуйте линию, используя маркер сухого стирания от двух детей объектов родительскому.

  • Когда все это будет сделано, о внутренних аспектах того, как класс работы.

Ответ 6

Изучите другой язык! Большинство разработчиков, использующих только Java (как пример), имеют ограниченное понимание OO, поскольку они не могут отделять языковые функции и концепции. Если вы еще этого не знаете, посмотрите на python. Если вы знаете python, изучите Ruby. Или выберите один из функциональных языков.

Ответ 7

Вопрос в вашем вопросе;)

Практика, практика, практика.

Просмотрите свой собственный код и узнайте об ошибках.

Ответ 8

TDD помог мне больше всего в улучшении моего общего набора навыков, включая ООП.

Ответ 9

Чем больше кода вы пишете, тем больше вы заметите подводные камни определенных методов программирования. После достаточного количества времени и достаточного количества кода вы сможете идентифицировать предупреждающие знаки этих ловушек и быть в состоянии избежать их. Иногда, когда я пишу код, я получу этот зуд в глубине души, говоря мне, что может быть лучший способ сделать это, хотя он делает то, в чем я нуждаюсь. Одна из моих самых больших недостатков в программировании - это "чрезмерное анализирование" вещей настолько, что оно начинает резко замедлять время разработки. Я пытаюсь предотвратить эти "зуды", потратив немного больше времени на дизайн, что обычно приводит к значительному сокращению времени написания кода.

... тайно я смотрю на некоторые вещи, которые мои коллеги делают с завистью. У многих из них, похоже, есть внутренний инстинкт ОО, которого у меня нет - как бы я ни старался...

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

Ответ 10

Дизайнеры языка интерпретировали "объектно-ориентированное программирование" по-разному. Например, посмотрите, как Алан Кей, человек, который первым использовал термин ООП, определил его:

OOP для меня означает только обмен сообщениями, локальный сохранения и защиты и процесс состояния и экстремальный поздняя привязка всех вещей. Может быть сделано в Smalltalk и в LISP. Там возможно, другие системы, в которых это возможно, но я не знаю их.

(Цитата из http://userpage.fu-berlin.de/~ram/pub/pub_jf47ht81Ht/doc_kay_oop_en).

Может показаться странным, что он не рассматривает языки программирования на языке Java и С++! Но, как разработчик одного из первых и лучших языков ООП (Smalltalk), у него есть свои веские причины для этого. Почему Алан Кей считал Lisp объектно-ориентированным языком, но не Java? Этот вопрос требует серьезного рассмотрения всеми, кто утверждает, что понимает ООП.

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

Я обобщил свои эксперименты с внедрением языка ООП на основе идей, заимствованных из Smalltalk, Scheme и Erlang в этой статье.

Ответ 11

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

Каждый из этих типов вещей, которые вы решили отслеживать, становится классом.

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

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

Ответ 12

Слишком много информации об объектах. Самое главное - освоить основы, и все становится легче.

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

Это абсолютный базис. Есть еще три концепции, которые вы должны полностью освоить:

Наследование - все это касается повторного использования кода.

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

Полиморфизм. Не имеет значения тип ссылочной переменной, но тип фактического экземпляра, чтобы узнать, какое поведение (метод) вызывается. Java не позволяет легко понять эту концепцию, потому что по определению все полиморфно..Net упрощает понимание, когда вы решаете, что такое полиморфное, а что нет, поэтому замечая разницу в поведении. Это достигается сочетанием виртуального и переопределения.

Если эти понятия будут хорошо поняты, вы будете в порядке.

Последний последний совет: вы упомянули лучшие книги. Вы читали " Мышление в Java" Брюса Эккеля? Я рекомендую эту книгу даже людям, которые начинаются в .Net, так как четко обозначены концепции ООП.

Ответ 13

       public void MasteryOfOOP() 
    { 
       while(true)

        /* My suggestion is: */
     DO: find a lot of well-written object oriented code and read it.  Then 
try to use the insights from it on your own coding.  Then do it again.  Then 
have a colleague who is a good OOP look at it and comment. Maybe post a chunk 
of your code on SO and ask for how it could be improved.

        Then read some more of those books.  Maybe they make a little more 
sense now...?

        Now go back to the top of this post, and do it again. 

        Repeat Forever.

        }
    }

Ответ 15

Навыки ООП наступают со временем. Чтение 1, 2... 10 книг не режет. Практика написания кода. Если вы работаете в среде программирования... это может быть полезно. Если не пытаться попасть в один. Предлагайте бесплатно разработать приложение (ы). Вы должны получить свои руки грязными. Помните, что приложение не является совершенным с нуля. Вот почему происходит повторное факторинг.

Также... не слишком увлекайтесь ООПом... это со временем. Беспокоитесь о разработке полностью функциональных приложений.

Ответ 16

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

Некоторые из интересных работ по теме "Я" Конструкция на основе прототипа с использованием SELF 4.0 (учебник по самообучению), Self: The Power of Simplicity и Организация программ без классов. Кроме того, Self: The Video (Randall B. Smith, Dave Ungar) потрясающе, поскольку два дизайнера языка объясняют идеи Self.

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

Ответ 17

Я также считаю, что навыки ООП в основном связаны с практикой. Подумайте о том, как изменить свою компанию, если вы там уже более 3 лет. Конечно, это не подходит для всех заданий, но часто человек привыкает к проектам и практике в компании и перестает развиваться с течением времени.

Ответ 18

Сверните свои рукава и код!

Ответ 19

Вы сами ответили: практика. Лучшим решением для этого является разработка игры. Используйте понятия, которые вы изучили в книгах.

Ответ 20

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

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

Ответ 21

Вы прочитали главу об ОО из первого издания книги Скотта Мейерса "Эффективный C++"? Это не дошло до более поздних изданий, но это было отличное объяснение. Название было в основном "скажем, что вы имеете в виду, значит, что вы говорите" о подходящих соглашениях.

На самом деле вам может понравиться мой ответ на аналогичный вопрос в здесь.

НТН

веселит,

Ответ 22

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

Удачи!

Ответ 23

OO наконец нажал на меня после того, как я попытался запрограммировать банковскую программу, которая обрабатывала транзакции, рассчитывал проценты и отслеживала все это. Я сделал это, когда изучал Java. Я бы предложил просто попробовать, завершить его, а затем, когда вы закончите, посмотрите на решение GOOD и посмотрите, что вы могли бы сделать лучше.

Ответ 24

Пиво помогает. шутки в сторону. лежать на диване с подушечкой для каракули A3, ручкой и пивом. Заблокируйте собаку, кошку и жену на улице. И подумайте о проблеме, пока она расслаблена. Даже не смей рисовать API!

Блок-схемы, карточки ответственности (CRC) и пиво (но не слишком много) проходят долгий путь.

Самый простой способ рефакторинга - не обязательно в первую очередь.

Ответ 25

http://misko.hevery.com/code-reviewers-guide/

Эти небольшие простые правила сделают вас лучшим программистом OO. Следуйте правилам, как вы кодируете, и вы обнаружите, что ваш код лучше, чем в противном случае.

Вы также захотите изучить Solid Principles: http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod

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

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

Ответ 27

Откажитесь! Зачем вам этот ООП? Просто напишите какое-нибудь полезное приложение. Не влияет на использование ООП, процедурный или функциональный подход.

Какой бы ни был подход, который вы выбираете, язык Python должен быть спонтанным, чтобы практиковать его.