Подтвердить что ты не робот

Как я получаю от привычки процедурного программирования и объектно-ориентированного программирования?

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

Итак, я думаю, что хорошие примеры обычных задач программирования, которые я часто выполняю, такие как аутентификация/управление пользователями, анализ данных, CMS/Blogging/eComs - это то, что я часто делаю, но я не смог чтобы понять, как делать их в ООП и от процедурного, особенно, поскольку системы, которые я строю, работают и работают хорошо.

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

Но я хочу изменить! моим товарищам-программистам, помогите:) какие-нибудь советы о том, как я могу вырваться из этого неприятного привычка?

4b9b3361

Ответ 1

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

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

Примерно 13 лет назад я переключился на С++ с c просто потому, что были идеи, которые мне нужны, но c нелегко выполнить. Короче говоря, моя потребность мотивировала мое программирование, ориентированное на объекты.

Объектно-ориентированный ум

Сначала у вас есть байты, символы, целые числа и поплавки.

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

Конгломерация данных

Так как информация о принтере должна иметь все свои переменные, заключенные в структуру принтера:

{id, name, location,
 impactType(laser|inkjet|ribbon),
  manufacturer, networkAddr},
  etc.

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

Включение информации

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

{id, name, location,
 impactType(laser|inkjet|ribbon),
 manufacturer, networkAddr,
 *print(struct printer),
 *clean(struct printer)
}

Выпускники данных в информацию, когда данные содержат процессы обработки/восприятия данных.

Квантование информации

Теперь лазерные, ленточные и струйные принтеры не все имеют одинаковый набор информации, но все они имеют наиболее распространенный набор знаменателей (LCD) в информации:

Информация, общая для любого принтера: идентификатор, имя, местоположение и т.д.

Информация найдена только в ленточных принтерах: usedCycles, лента (ткань целлофана), colourBands и т.д.

Информация найдена только в струйной печати: чернильные картриджи и т.д.

Информация найдена только в лазерах:...

Для меня и многих объектно-ориентированных когорт мы предпочитаем квантовать всю общую информацию в одну общую инкапсуляцию информации, а не определять отдельную структуру/инкапсуляцию для каждого типа принтера.

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

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

Необходимость лень

Некоторые говорят: необходимость - это мать творчества. (а также, Любовь к деньгам - это корень зла).

Но мне и моим когортам - лени перед лицом необходимости являются родители творчества. (а также отсутствие денег - другой родитель зла).

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

Ответ 2

Шаг 1. Прочтите хорошую книгу шаблонов моделей. http://www.oodesign.com/

Шаг 2. Выберите то, что вы уже знаете, и переработайте его с точки зрения ОО. Это подход Code Dojo. Возьмите проблему, которую вы уже понимаете, и определите классы объектов.

Я сделал это - и записал, что я сделал.

См. http://homepage.mac.com/s_lott/books/oodesign.html#book-oodesign

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

Ответ 3

Мнение OO основано на принципах, которые лежат на гораздо более базовом уровне, чем шаблоны проектирования. Модели дизайна как-то модно в наши дни (и на какое-то время), и они полезны, но это всего лишь еще один слой, который вы можете наложить на более простые вещи, которые вы должны обязательно изучить и освоить, если вы хотите правильно выполнять OO, Другими словами: вы можете отлично выполнять OO без шаблонов проектирования. Фактически, многие из нас делали OO задолго до того, как была придумана фраза "шаблоны дизайна".

Теперь есть вещи, с которыми вы не можете обойтись. Я предлагаю вам начать с основ. Прочтите и поймите "Объектно-ориентированное программное обеспечение" 2-е издание Бертран Майер. Это, вероятно, лучшая книга по программированию OO вокруг, как по ширине, так и по глубине. То есть, если вы заинтересованы в программировании.

Ответ 4

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

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

Опять же, я соглашусь со всеми рекомендациями по шаблонам проектирования. В частности, я бы рассмотрел шаблон MVC (Model-View-Controller), поскольку этот, возможно, самый простой способ понять. Вы уже написали код, чтобы вы могли смотреть на свои существующие приложения и начинать вкладывать каждую часть в категории M, V или C.

Удачи и получайте удовольствие!

Ответ 5

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

Из многих понятий в объектно-ориентированном программировании основной, который будет держать вас в курсе как новичок, - это инкапсуляция. Мой класс знает, как позаботиться о себе? Есть ли у моего класса поведение? Если это не так, то у вас нет класса, у вас есть структура, и вы, вероятно, будете писать много процедур для изменения своего состояния (как он сказал, "вы вернулись к написанию C в Java" ), Мой класс только публично раскрывает методы, которые необходимы для его использования? Эти вопросы, возможно, не так уж продуманы, но, возможно, рассмотрим этот мысленный эксперимент при разработке ваших классов: что, если бы каждый из ваших классов приложений должен был разрабатываться и поддерживаться другим разработчиком в Интернете, а классы также должны были взаимодействовать друг с другом интернет. Согласятся ли каждый разработчик, что класс, который они пишут и поддерживает, придерживается принципа принципа единой ответственности и поэтому должен быть рад, что они не поддерживают то, что должно быть кем-то elses-кодом?

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

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

Ответ 6

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

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

Ответ 7

Вы можете использовать подход карты CRC (Class/Responsibility/Collaboration) к дизайну OO. Это не слишком страшно - просто способ разобраться, какие должны быть ваши объекты, и какой объект должен отвечать за какие задачи, записывая материал на кучу карточек файлов, чтобы помочь прояснить ваши мысли.

Первоначально он был разработан как инструмент обучения для мышления ОО и мог работать для вас. Оригинальная статья: http://c2.com/doc/oopsla89/paper.html

Плакат над предлагаемым программированием в Smalltalk, чтобы заставить вас использовать привычки OO, и в той степени, в которой это хорошее предложение - Smalltalk, конечно, сделал мне много хорошего, но

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

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

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

Ответ 8

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

"Put stuff together that changes together."

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

Это также называется "Изменение скорости".

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

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

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

Аналогично, если класс имеет две части которые изменяются одинаково часто, но при в разное время или в разных (т.е. для разные причины), то это снова предлагает рефакторинг класса.

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

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

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

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

PS: другим принципом, которым вы должны следовать, является "Закон Деметры", то есть объект должен говорить только со своими друзьями. Друзья: сами, переменные экземпляра, параметры, локали и члены дружественных коллекций, но не глобальные и статические переменные.

Ответ 9

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

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

Ответ 10

Думаю, вам следует убедить себя, исследуя все недостатки с процедурным программированием, например (некоторые из следующих слов, следите за): scope, state... практически вы сможете извлечь много терминов, просто прочитав примеры шаблонов проектирования (читайте: общие примеры использования объектов вместе.)

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

Ответ 11

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

Посмотрите, как это работает для вас.

Ответ 12

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

Это просто большой набор вещей. Это не связано с ООП, и большинство из них, таких как singleton, постоянно используются по всем неправильным причинам (т.е. инициализации). Некоторые из этих вещей, которые вы должны использовать, чтобы рассказывать о них, бессмысленны, другие контрпродуктивны, а остальное - всего лишь случайные вещи. Если вы попытаетесь чему-либо научиться, все начнет выглядеть как какой-то странный doodad кто-то придумал для очень особенной проблемы или потому, что они нуждались в бесконечной рождаемости (что редко бывает). Не позволяйте людям использовать миллионы итераторов и шаблонов без всякой причины и делать вещи в десять раз более сложными.

Действительно, ООП - это простой объект, который становится значительно сложным. К сожалению, в С++ у него много проблем, но действительно важны простые виртуальные методы. Чистые виртуальные базовые классы, используемые так же, как и объект интерфейса Java, являются наиболее полезными, но и просто виртуальными методами здесь и там пригодится.

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

Ответ 13

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

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

Ответ 14

Не.

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

Теперь, когда вы знаете, какие объекты, вы увидите, что объекты не найдены в коде. Они находятся во время выполнения; в пространстве между машиной и сознанием пользователя. Это то, что означает объектная ориентация. К сожалению, недавние научные круги превратили его в инженерную концепцию. Ничто не может быть дальше. И попробуйте, чтобы они могли подражать, конечный результат - дерьмо. Зачем? Потому что парадигма "ООП", известная сегодня в отрасли, построена на фундаментально ошибочной идее: декомпозиционный анализ идентичности. Как это порочит? Потому что само по себе лишено смысла. Это недействительно. В математическом смысле, в философском смысле. Это не то, как человек воспринимает и взаимодействует с миром.

Канон: Алан Кей, Трюгве Реенскауг, Джеймс (Джим) Коплиен

Как бы я хотел, чтобы я был на вашем месте.:)

Ответ 15

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

Это очень трудоемко, и вам нужно сначала изучить основы ООП (у S.Lott есть отличные ссылки в другом ответе). Постоянный рефакторинг и множество "Doh!" моментом является правило; но я нашел это отличным способом изучения модульного программирования, потому что все, что я сделал, сразу же стало заметным при реализации одного из проектов.

Ответ 16

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

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

Ответ 17

Просто практикуйте. Если вы прочитали все о ООП и знаете что-то о ООП, и вы знаете принципы ООП, реализованные на вашем языке PHP... затем просто практикуйте, практикуйте и практикуйте еще немного.

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

Ответ 18

Изучите новый язык, который поможет вам мягко перемещать вас в ООП. Java хорош, но немного вздут. Но его системная библиотека в основном OO, поэтому вы можете использовать объекты. Переход на другой язык также поможет вам не повторно использовать старый код: -)

Ответ 19

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

Ответ 20

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

  • OO делает намного больше смысла, когда вы понимаете указатели на функции и как это относится к косвенным вызовам функций и позднему связыванию. Поиграйте с указателями функций на C, С++ или D на некоторое время и получите представление о том, для чего они предназначены и как они работают. Часть полиморфизма/виртуальной функции OO - это еще один слой абстракции поверх этого.

  • Процедура - это правильный инструмент для некоторых заданий. Не поступай так неправильно. ИМХО все три основные парадигмы (процедурные, ОО, функциональные) ценны даже на мелкозернистом уровне в рамках одного модуля. Я предпочитаю:

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

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

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