Что почитать и на чем потренироваться, не могу перейти от процедурного к ооп?

Языки начал изучать с ZX Basic и ASM, далее Pascal и Delphi.
Потом и ушел в админство и все рабочие скрипты даже на PowerShell/PowerCli пишу по принципу процедурного программирования, ООП использую только когда работаю с интерфейсом, если конечно это можно назвать ООП.
Сейчас изучаю python и ruby и пока основы, вроде всё легко и понятно, а как доходит до объектов всё ступор.
Подскажите, с чего начать?
  • Вопрос задан
  • 3164 просмотра
Пригласить эксперта
Ответы на вопрос 12
qonand
@qonand
Software Engineer
Бертран Мейер - Объектно-ориентированное конструирование программных систем
Мэтт Вайсфельд - Объектно-ориентированное мышление
Грэди Буч - Объектно-ориентированный анализ и проектирование с примерами приложений
Ответ написан
Комментировать
alexfilus
@alexfilus
Senior backend developer
Я по настоящему постиг ООП когда при доработках программы перестал понимать код написанный час назад.
Понял что без него никак, отрефакторил, то что было на тот момент. В последствии ещё полтора года пилил ту прогу, но никаких проблем с читабельностью не возникало. Это к вопросу зачем он нужен.
В изучении поможет только практика. Попробуйте не писать интерфейсов и прочих высокоуровневых штук пока что. Возьмите что-то простое. Например напишите свою библиотечку для работы с линейной алгеброй.
2 класса - матрица и вектор. И работа с ними. Ввод, вывод, перемножение, транспонирование, поиск определителя матрицы.
Добавьте статических методов, например генерацию единичной матрицы.
Дальше можно написать решения СЛУ разными способами. Подумать как переиспользовать уже готовые методы.
Останется наследование.
Попробуйте написать свою, простую ORM. Набор базовых CRUD методов как абстрактный класс, и наследуясь от него классы для работы с конкретными таблицами.
Если не увлекаться перфекционизмом, и универсальностью применения данных классов, этих 2 велосипедов будет вполне достаточно чтобы разобраться что к чему с ООП в любом выбранном вами языке.
Ответ написан
Комментировать
zo0m
@zo0m
full stack developer
Прочтите пяток страниц из Философии Java, там вначале Эккель, на сколько я помню, граммотно разобрал этот вопрос. Помню, лет 8 назад мне помогло)
Вот со второй страницы читайте:
www.rulit.me/books/filosofiya-java-read-180907-2.html

Не пугайтесь слово Java, вначале объяснения в отрыве от языков.
Ответ написан
Комментировать
Adamos
@Adamos
Практика. Решайте задачи, не давая себе писать ни строчки вне объектов. Теория суха...
Ответ написан
@legoboy90
Ничего страшного. Я скажу так - просто постарайся решить задачу другим способом. Если взять в пример язык Си - есть определяемый тип данных, структуры(в Psacal это вроде как "запись"(record) называется).

Т е есть тип данных, с помощью которого мы можем поместить данные о каком-нибудь предмете обсуждения - скажем, фильмы: год, рейтинг, имя главного актера и т д. Важно тут уяснить сам момент - точно так же как ты создаешь целое число, ты описываешь структуру данных/записьи упаковываешь её в свой производный тип, но ты говоришь - "Эй, компилятор, мне нужно не число, символ, мне нужно создать мой новый тип данных, внутри него будут 3 целых числа и 1 строка; потом создай 3 объекта данных моего типа.". Т е ты породил новый тип данных. Это удобно, чем бегать за кучами переменных и выяснять как они соотносятся друг с другом, теперь информация о !каждом! фильме хранится в своём скомпанованном месте.
А пойдем дальше - в языках, где есть сООП ты можешь делать класс - данные + функции. Это своего рода новый тип данных, содержащих не только значения, но и код(те же функции). Другими словами - мы создали структуру и запихали ещё и функции, чтобы в каждом объекте хранить ещё и код, который может работать с данными. Это и есть класс, на основе него ты создаешь новые объекты В чём преимущество? Возьмём наши фильмы. Например, будет очень удобно вызвать из объекта функцию, который ведёт диалог занесения информации о фильме и мы не пропустим ничего - название,год,актёр, рейтинг. Объект не создастся, пока мы не занесём полную информацию о нём. Или скажем, в нём будет функция, где она будет считать рейтинг провальным, если он ниже 5. Нам не нужно каждый раз дёргать объект, он сам анализирует данные и записывает в него же информацию.

Считаю, что теорию по ООП нет смысла читать. Вот тот же Python - Билл Любанович "Python. Современный стиль программирования". Попробуй его, написано просто. В Python всё объект (в книге с первых глав всё это показывается и ничего там страшного нет). Самая практичная задача- подключись к zabbix и попробуй вытащить из него данные. Ощутишь ООП сразу. Схема простая и тупая - импортируешь модуль по работе с zabbix, потом ты инициализируешь объект(хост zabbix, логин, пароль). И ВСЁ! у тебя есть объект, через него ты работаешь, в нём всё уже есть (если аутентификация не прошла или невозможно подключится к хосту, то оъект не создастся, вот тебе пример ООП, что у объекта есть код помимо данных). Или другой пример - у того же Любановича есть пример с созданием файла конфига.(Config Parser). написано про него мало, тупо гуглишь. Короче - импорт модуля (какой-то дядька его написал), а ты просто импортиуешь модуль где уже есть этот "тип данных" (класс), а на основе него ты создаешь объекты и работаешь с ними. А потом дополни задачу себе сам - собирать данные из объектов в кучу и их обрабатывать. Вот тут ты и будешь писать классы=)
Ответ написан
Комментировать
KM-Brothers
@KM-Brothers
Я знаю, что ничего не знаю...
Мне, в свое время, помогло изучение шаблонов (паттернов) проектирования. Понравилось как преподнес эту тему Мэтт Зандстра в книге "PHP: объекты, шаблоны и методики программирования", начиная с 7-й главы.
Ответ написан
Комментировать
ThunderCat
@ThunderCat
{PHP, MySql, HTML, JS, CSS} developer
а как доходит до объектов всё ступор. Подскажите, с чего начать?

Для начала понять, что в объектах не так для вас?
В целом, с точки зрения процедурщика - объект это набор функций и переменных, просто объединенный в единый код (например отдельный файл со всеми переменными и функциями обработки), относящийся к конкретному объекту реального мира. Вместо подгрузки этого файла в коде будет вызов создания объекта(например vasea = new User()), причем при создании автоматически можно что-то сделать, например вытащить из бд юзера с определенными заданными данными (например vasea = new User('vasea','pupkin')), через конструктор.
Кроме того, т.к. код попадает в память только при создании объекта, соблюдается правило "платим только за то что используем", а не как при глобальных переменных и функциях - фигачим все, потом юзаем 1-2 функции.
И структура - ооо, это такой кайф - все функции привязаны к конкретным объектам, если ищешь логин пользователя - идешь в пользователя и только туда, правишь 1 строку - и все сразу работает везде! Короче - нужно вникнуть и ощутить )
Ответ написан
Комментировать
Dit81
@Dit81
Security researcher, pentester, internet-marketer
Сейчас ООП повсюду, лучше посмотреть на реализацию ООП в Python и Ruby... Можно еще Java захватить, там без объектов никуда вообще...
Ответ написан
Комментировать
@xfg
Ну это очень просто. Объект - это сущность, которая имеет некое состояние и поведение, через которое это состояние можно изменить. Объект может содержать в себе другие объекты, тогда это принято называть агрегатом.

Скажем вы пишите софт для компании по грузоперевозкам. У компании наверняка как минимум есть автомобиль и есть груз. Груз можно поместить в автомобиль. Поместить объем груза больше объема вместительности автомобиля невозможно.

Можно смоделировать этот пример допустим на php (синтаксис может быть некорректен!) таким образом
(свойства объектов желательно делать приватными с доступом через геттеры, чтобы состояние объекта было невозможно изменить вне его. Опущено, ради упрощения).
class Car {
  public $id;
  public $capacity;
  public $payload;

  public function __construct(int $id, int $capacity, array $payload) {
    $this->id = $id;
    $this->capacity = $capacity;
    $this->payload = $payload;
  }
  public function assignCargo(Cargo $cargo) {
    if ($cargo->volume + $this->calculateOccupiedCapacity() > $this->capacity) {
      throw new DomainException('The capacity has been exceeded.');
    }
    $this->payload[] = $cargo;
  }
  private function calculateOccupiedCapacity() {
    return array_reduce($this->payload, function($accumulator, $cargo) {
      return $accumulator += $cargo->volume
    });
  }
}

class Cargo {
  public $volume;
  
  public function __construct($volume) {
    $this->volume = $volume;
  }
}

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

Гораздо сложнее с инфраструктурой. Автомобиль хотелось бы сохранять в хранилище, извлекать его оттуда и до загружать его. Здесь начинаются проблемы вроде impedance mismatch. Затем наверняка изменение одного объекта, будет влиять на состояние другого и нужно будет выстраивать систему для работы с доменными событиями. И много всего такого. Но это уже про инфраструктуру. Саму бизнес-модель спроектировать как объектно-ориентированную не является уж совсем чем-то запредельно сложным. Достаточно помнить, что это должны быть по возможности plain php object, которые не зависят от стороннего кода фреймворков и библиотек. В этом случае бизнес-модель можно будет запустить на любом фреймворке/окружении.

Почитать можно что-нибудь про многоуровневую архитектуру. В контексте Java много пишут об этом. В книге Implementing domain-driven design автор хорошо рассказывает про все уровни приложения и о том, как они взаимодействуют друг с другом.
Ответ написан
Комментировать
saboteur_kiev
@saboteur_kiev
software engineer
Объект - это некоторые данные (в первую очередь), и методы которые работают с этими данными.

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

Нужно понять зачем нужен ООП. В небольших проектах он не нужен. В проектах, над которыми работает больше 1-3 человек - уже полезен. А в крупных - необходим, иначе в принципе не получится организовать работу большого количества людей над одной программой, без инкапсуляции, для чего и придумали ООП.
Ответ написан
Комментировать
@Vjatcheslav3345
Можно попробовать проявить "принцип максимальной вредности" в обучении - намеренно поставить себя кое где в строгие условия, требующие применения ооп.
Например, можно начать писать очень короткие - с десяток строк - полезные на работе программки на smalltalk (или self или Io).

Например - писать что то типа простеньких анализаторов логов для подсчёта статистики - в библиотеке Смолтока например, есть регулярные выражения и вообще, классы по работе с текстом - которые станут основой многих своих текстовых велосипедов.
Ещё полезно помнить, что ооп вышло из процедурного программирования и можно посмотреть современные реализации различных процедурных языков - например, openeuphoria.
Ответ написан
Комментировать
@egormmm
Борітеся — поборете!
Чтобы что-то понять - нужно начинать с истории.
История для ООП - это Теория систем. Она же и теоретическая основа.
С нее и начинайте.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы