Как я повреждаю свои процедурные привычки кодирования? [закрытый]

18
задан Community 23 May 2017 в 12:01
поделиться

12 ответов

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

  • состав Пользы по наследованию. Прочитайте и перечитайте первую главу , книга .
  • GoF Повинуется Закон Demeter ("говорят, не спрашивайте")
  • Попытка использовать наследование только для достижения полиморфизма. При расширении одного класса от другого сделайте так с идеей, что Вы будете вызывать поведение того класса через ссылку на базовый класс . ВЕСЬ , открытые методы базового класса должны иметь смысл для подкласса.
  • не становятся одержимыми моделированием. Создайте рабочий прототип для информирования дизайна.
  • рефакторинг Объятия. Прочитайте первые несколько глав книга .
Fowler
9
ответ дан 30 November 2019 в 05:58
поделиться

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

, Во-вторых, я читал на шаблонах разработки. Трудно понять OO без некоторых примеров реальных проблем, это хорошо для решения. Направляйтесь Первые Шаблоны разработки хорошее чтение, поскольку оно отвечает на большое количество из "почему" из OO.

15
ответ дан 30 November 2019 в 05:58
поделиться

Класс 'менеджера' часто будет:

  1. Interogate что-то - состояние
  2. , Принимают решение на основе того состояния

Как противоядие или контраст по отношению к этому, Объектно-ориентированный дизайн поощрил бы Вас разрабатывать API класса, где Вы "говорите, не просят", чтобы сам класс сделал вещи сам (и инкапсулировал его собственное состояние): для больше о "говорят, не просят" видеть, например, здесь и здесь (и возможно у кого-то еще есть лучшее объяснение, "говорят, не спрашивают", но они являются первыми две статьи, которые Google нашел для меня).

Это походит на основную стратегию небольшой код OO, который мы производим, должен разломать проблему на классы, которые легко идентифицируются как дискретные единицы и затем помещают левых по/обобщил битам в классе "менеджера".

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

  • Автономные объекты
  • И, "транзакции", которые действуют на другие объекты

, Садятся, например, на самолет (и я сожалею о предоставлении Вам другой автомобильный пример; я перефразирую его):

  • 'объекты' могли бы включать элероны, руководящий принцип и тягу
  • , 'менеджер' или autpilot реализуют различные команды или транзакции

, Например, "повернуть направо" транзакция включает:

  • flaps.right.up ()
  • flaps.left.down ()
  • rudder.right ()
  • thrust.increase ()

, Таким образом, я думаю, что это верно, что у Вас есть транзакции, которые сокращают через или используют различные относительно пассивные 'объекты'; в приложении, например, "независимо от того, что" пользовательская команда закончит тем, что была реализована (и поэтому, вызывая) различные объекты от каждого слоя (например, UI, средний слой и уровень DB).

, Таким образом, я думаю, что это верно, что до некоторой степени Вы будете , имеют в запасе 'биты'; это - вопрос градуса хотя: возможно, необходимо хотеть как можно больше кода быть автономными, и инкапсуляция, и все... и перенесенные биты, который использование (или зависят от) все остальное, должен даваться/использоваться API, который скрывается как можно больше и который делает как можно больше, и который поэтому берет на себя как можно больше ответственности (детали реализации) далеко от так называемого менеджера.

, К сожалению, я имею только чтение этого понятия в той одной книге ( Усовершенствованный C++ ) и не могу связать Вас с чем-то онлайн для более четкого объяснения, чем этот мой пересказ.

7
ответ дан 30 November 2019 в 05:58
поделиться

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

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

8
ответ дан 30 November 2019 в 05:58
поделиться

Чтение и затем осуществление принципов OO что работы для меня. Голова Сначала Объектно-ориентированный Анализ & Дизайн работает Вы через примеры для создания решения, которое является OO и затем способами сделать решение лучше.

6
ответ дан 30 November 2019 в 05:58
поделиться

Можно изучить хорошие объектно-ориентированные принципы разработки путем изучения , Код шаблонов разработки . , Завершенный 2 , является хорошей книгой для чтения по теме. Естественно, лучший способ внушить хорошие принципы программирования в Ваш ум состоит в том, чтобы постоянно практиковать их путем применения их к собственным проектам кодирования.

5
ответ дан 30 November 2019 в 05:58
поделиться

Сколько программистов ООП требуется, чтобы заменить лампочку?

Ни один, лампочка изменяет себя.

;)

3
ответ дан 30 November 2019 в 05:58
поделиться

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

3
ответ дан 30 November 2019 в 05:58
поделиться

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

необходимо определить ОБЪЕКТЫ, необходимые в applicaiton, затем определить АТРИБУТЫ каждого entitie и МЕТОДЫ. если существуют повторенные, Вы могли бы теперь переопределить свои объекты способом, что наследование могло быть сделано, для предотвращения дублирования. :D.

1
ответ дан 30 November 2019 в 05:58
поделиться

, Как я могу повредить свои процедурные привычки (как класс менеджера)?

Делают класс для того, чем управляет менеджер (например, если у Вас есть класс ConnectionManager, сделайте класс для Соединения). Переместите все в тот класс.

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

не боятся сделать маленькие классы. Происхождение из процедурной среды, можно думать, что это не стоит усилия сделать класс, если это не тысяча строк кода и является некоторым базовым понятием в домене. Думайте меньшие. Десять классов строки полностью допустимы. Сделайте небольшие классы, где Вы видите, что они имеют смысл (Дата, MailingAddress) и затем прокладывают себе путь путем создания классов из тех.

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

4
ответ дан 30 November 2019 в 05:58
поделиться

Мой эврика момент для понимания объектно-ориентированного дизайна был, когда я прочитал книгу Eric Evans "Управляемый Доменом Дизайн: Занятие Сложностью в самом центре программного обеспечения" . Или "Доменный Управляемый Дизайн Быстро" мини-книга (который доступен онлайн как свободный PDF), если Вы являетесь дешевыми или нетерпеливыми. :)

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

1
ответ дан 30 November 2019 в 05:58
поделиться

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

  1. Узнайте, что такое разработка через тестирование (TDD). Вы можете удобно сделать это с помощью процедурного кода, поэтому вам пока не нужно начинать работу с объектами, если вы этого не хотите. От этого зависит второй шаг.

  2. Возьмите копию книги Мартина Фаулера «Рефакторинг: улучшение дизайна существующего кода». По сути, это каталог небольших изменений, которые вы можете внести в существующий код. Однако вы не можете правильно выполнить рефакторинг без тестов. Это позволяет вам возиться с кодом, не беспокоясь о том, что все сломается. Тесты и рефакторинг устраняют паранойю и ощущение того, что вы не знаете, что произойдет, что невероятно освобождает. Вы ушли, чтобы просто поиграть. По мере того, как вы становитесь более уверенными в этом, начните исследовать имитаторы для тестирования взаимодействий между объектами.

  3. Теперь приходит большое, с чего большинство людей ошибочно начинают, это хороший материал, но он действительно должен занять третье место. На этом этапе вы можете прочитать о шаблонах проектирования, запахах кода (это хорошо для Google) и принципах объектно-ориентированного дизайна. Также узнайте о пользовательских историях или вариантах использования, поскольку они дают вам хорошие начальные классы кандидатов при написании новых приложений, что является хорошим решением вопроса «с чего начать?» проблема при написании приложений.

И все! Доказанная доброта! Сообщите мне, как это происходит.

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

  • Теперь приходит большое, с чего большинство людей ошибочно начинают, это хороший материал, но он действительно должен занять третье место. На этом этапе вы можете прочитать о шаблонах проектирования, запахах кода (это хорошо для Google) и принципах объектно-ориентированного дизайна. Также узнайте о пользовательских историях или вариантах использования, поскольку они дают вам хорошие начальные классы кандидатов при написании новых приложений, что является хорошим решением вопроса «с чего начать?» проблема при написании приложений.

  • И все! Доказанная доброта! Сообщите мне, как это происходит.

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

  • Теперь приходит большое, с чего большинство людей ошибочно начинают, это хороший материал, но он действительно должен занять третье место. На этом этапе вы можете прочитать о шаблонах проектирования, запахах кода (это хорошо для Google) и принципах объектно-ориентированного дизайна. Также узнайте о пользовательских историях или вариантах использования, поскольку они дают вам хорошие начальные классы кандидатов при написании новых приложений, что является хорошим решением вопроса «с чего начать?» проблема при написании приложений.

  • И все! Доказанная доброта! Сообщите мне, как это происходит.

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

  • Теперь приходит большое, с чего большинство людей ошибочно начинают, это хороший материал, но он действительно должен занять третье место. На этом этапе вы можете прочитать о шаблонах проектирования, запахах кода (это хорошо для Google) и принципах объектно-ориентированного дизайна. Также узнайте о пользовательских историях или вариантах использования, поскольку они дают вам хорошие начальные классы кандидатов при написании новых приложений, что является хорошим решением вопроса «с чего начать?» проблема при написании приложений.

  • И все! Доказанная доброта! Сообщите мне, как это происходит.

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

  • Теперь приходит большое, с чего большинство людей ошибочно начинают, это хороший материал, но он действительно должен занять третье место. На этом этапе вы можете прочитать о шаблонах проектирования, запахах кода (это хорошо для Google) и принципах объектно-ориентированного дизайна. Также узнайте о пользовательских историях или вариантах использования, поскольку они дают вам хорошие начальные классы кандидатов при написании новых приложений, что является хорошим решением вопроса «с чего начать?» проблема при написании приложений.

  • И все! Доказанная доброта! Сообщите мне, как это происходит.

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

    И все! Доказанная доброта! Сообщите мне, как это происходит.

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

    И все! Доказанная доброта! Сообщите мне, как это происходит.

    1
    ответ дан 30 November 2019 в 05:58
    поделиться