Выход из процедурного мышления - PullRequest
9 голосов
/ 20 сентября 2010

Я занимаюсь программированием (как работа) уже около 3-4 месяцев после окончания университета, изучая информатику.

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

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

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

Кроме того, есть ли какие-либо советы о том, как действительно продвинуться в способности правильно разрабатывать решения проблем?

Ответы [ 7 ]

11 голосов
/ 20 сентября 2010

Я думаю, что это требует много практики.

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

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

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

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

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

4 голосов
/ 20 сентября 2010

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

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

3 голосов
/ 20 сентября 2010

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

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

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

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

Кроме того, есть ли какой-нибудь совет о том, как действительно продвинуться в способности правильно разрабатывать решения проблем?

Я настоятельно рекомендую прочитать эти 2 "электронные книги" Принципы SOLID и 31 Дней Рефакторинга .Тот, что в SOLID, очень хорош в аспектах проектирования кода, особенно в гибкой среде.Тот, что касается рефакторинга, поможет вам определить возможности улучшения в существующем коде.

1 голос
/ 20 сентября 2010

Глядя на Числовые рецепты в C , вы испытаете процедурное программирование. Вызовы функций с бесконечными списками параметров, управление потоком программ распределяется по многим процедурам. Возьмите простой алгоритм вроде «Runke-Kutta» и перенесите его на язык ООП по вашему выбору. Инкапсуляция и передача сообщений - это совершенно другое мышление.

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

Одним из шагов в изучении ООП является способность преобразовывать / моделировать объекты реального мира в свойства и методы класса. Такие книги, как Effective Java , Шаблоны реализации , GoF , помогут вам выбрать лучшие методики при вводе объектов реального мира в код.

1 голос
/ 20 сентября 2010

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

0 голосов
/ 20 сентября 2010

Реализуйте COM-объекты в C, и вы поймете разницу между ООП и процедурным ...

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

0 голосов
/ 20 сентября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...