Table of Contents

ООП

Термины

Абстрактный класс
класс, не предполагающий создание экземпляров. Используется только для наследования другими классами.
Сервис

класс, который структуризирует некоторую функциональность и даёт её использовать другим классам. Что-то вроде файлов utils из других языков, но в ООП мире.

Подробнее о сервисах: [Wikipedia: Service-Oriented Programming]

Отношения

Наследование
отношение "является". Легковой автомобиль является автомобилем, значит легковой автомобиль наследуется от класса автомобиля.
class Vehicle
{
    bool hasWheels;
}

class Car : Vehicle
{
    string model = "Porshe";
    int numberOfWheels = 4
}
Ассоциация
отношение "имеет". Автомобиль имеет двигатель, двигатель не является автомобилем, соответственно двигатель не будет являться наследником класса автомобиль.
class Engine
{
    int power;
    public Engine(int p)
    {
	power = p;
    }
}

class Car
{
    string model = "Porshe";
    Engine engine;
    public Car()
    {
	this.engine = new Engine(360);
    }
}   
Композиция
двигатель создаётся внутри автомобиля и не является отдельной сущностью.
class Engine
{
    int power;
    public Engine(int p)
    {
	power = p;
    }
}

class Car
{
    string model = "Porshe";
    Engine engine;
    public Car()
    {
	this.engine = new Engine(360);
    }
}
Агрегация
двигатель является отдельной сущностью и включается в класс автомобиля, путём передачи в конструктор.
class Engine
{
    int power;
    public Engine(int p)
    {
       power = p;
    }
}        

class Car
{
    string model = "Porshe";
    Engine engine;
    public Car(Engine someEngine)
    {
	 this.engine = someEngine;
    }
}

Engine goodEngine = new Engine(360);
Car porshe = new Car(goodEngine);

Подробнее об этих отношениях в статье "Наследование, композиция, агрегация".

Модификаторы доступа

  • public – доступно всем
  • private – доступно только классу, недоступно экземпляру и наследнику
  • protected – доступно классу и наследнику, недоступно экземпляру
  • final – нельзя отнаследоваться никому
  • static – метод принадлежит классу, а не экземпляру

Интерфейсы

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

Dependency Injection

Частный случай инверсии зависимостей.

Инверсия зависимостей на Хабре

Service Locator

Дав интерфейс Service Locator'у, он возвращает экземпляр конкретного класса, реализующий переданный ему интерфейс.

Хорошие вещи

Интерфейсы

Композиция классов, mixin'ы, trait'ы и т.д.

Критика

Геттеры и Сеттеры используются не по назначению

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

https://lispcast.com/why-getters-and-setters-are-terrible/ https://www.infoworld.com/article/2073723/why-getter-and-setter-methods-are-evil.html

Аннотации

Наследование

Паттерн Синглтон

Зачем создавать класс, который плодит всего один объект, если возможно создать сразу объект как например в Javascript или Scala.

Классы используются ради единственной сущности, а не ради многих

Классы используют тогда, когда можно обойтись структурой

ООП нетрадиционное

  • Lisp
  • Smalltalk
  • Erlang
  • Ruby / Python

Metaobject Protocol

ООП в разных языках

Статьи

  • Richard P. Gabriel — The Structure of a Programming Language Revolution

w96k Ⓐ 2019-2022

2022-11-14 Mon 20:38