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


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

21 68
oop

21 ответ:

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

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

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

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

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

твердые подкасты:http://www.hanselminutes.com/default.aspx?showID=168, http://www.hanselminutes.com/default.aspx?showID=163

твердое нервное расстройство: http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod

сухой: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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  3. когда все это будет сделано, то беспокоиться о внутренностях того, как класс завод.

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

aswer находится в вашем вопросе ;)

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

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

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

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

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

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

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

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

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

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

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

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

       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.

        }
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

также...не увлекайтесь ООП тоже much...it некоторые со временем. Беспокойство о развитии полностью функциональные приложения.

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

некоторые из интересных работ о себе являются прототип на основе конструкции приложения с использованием SELF 4.0 (самоучитель),Self: сила простоты и Организация Программ Без Занятий. Кроме того,Self: The Video (Randall B. Smith; Dave Ungar) Это потрясающе, когда два дизайнера языка объясняют свои идеи.

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

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

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

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

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

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

HTH

спасибо,

засучите рукава и код!