Course program← Объектно ориентированное программирование
1История ООП
2Объект и Класс
3Базовые концепции ООП
4Принцип проектирования GRASP
5Принцип проектирования SOLID
6Паттерны GOF

Абстракция

This lesson is not translated yet – the Russian original is below.

TODO: отвалидировать – текст собран автоматически из материалов курса на Google Drive, проверьте формулировки и код.

Определение: Абстракция – фокусировка на существенных характеристиках объекта с игнорированием деталей.

  • Видимо: кнопки выбора кофе.

  • Скрыто: механизм помола, нагрев воды.

  • Абстракция: «Что делает?»

  • Инкапсуляция: «Как защищено?»

Пример

using System;
using System.Reflection;

public class CoffeeMachine
{
    private bool _coffeeIsPrepared = false;
    private bool _waterIsBoiled = false;

    public bool MakeCoffee()
    {
        GrindCoffee();
        BoilWater();
        return _coffeeIsPrepared && _waterIsBoiled;
    }

    private void GrindCoffee()
    {
        _coffeeIsPrepared = true;
    }

    private void BoilWater()
    {
        _waterIsBoiled = true;
    }
}

class Program
{
    static void Main()
    {
        CoffeeMachine coffeeMaker = new CoffeeMachine();
        
        Console.WriteLine(coffeeMaker.MakeCoffee()); // Выведет: True
    }
}
#include <iostream>

class CoffeeMachine {
public:
    // Наружу торчит только этот метод
    bool MakeCoffee() {
        GrindCoffee();
        BoilWater();

        return coffee_is_prepared_ && water_is_boiled_;
    }

private:
    bool coffee_is_prepared_ = false;
    bool water_is_boiled_ = false;

    void GrindCoffee() { coffee_is_prepared_ = true; }
    void BoilWater() { water_is_boiled_ = true; }
};

int main() {
    CoffeeMachine coffee_maker;

    std::cout << std::boolalpha << coffee_maker.MakeCoffee() << std::endl; // true

    return 0;
}
package main

import "fmt"

// Наружу торчит только MakeCoffee: методы с маленькой буквы
// не видны за пределами пакета.
type CoffeeMachine struct {
	coffeeIsPrepared bool
	waterIsBoiled    bool
}

func (m *CoffeeMachine) MakeCoffee() bool {
	m.grindCoffee()
	m.boilWater()

	return m.coffeeIsPrepared && m.waterIsBoiled
}

func (m *CoffeeMachine) grindCoffee() { m.coffeeIsPrepared = true }

func (m *CoffeeMachine) boilWater() { m.waterIsBoiled = true }

func main() {
	coffeeMaker := &CoffeeMachine{}

	fmt.Println(coffeeMaker.MakeCoffee()) // Выведет: true
}
class CoffeeMachine:
    def __init__(self):
        self.__coffee_is_prepared = False
        self.__water_is_boiled = False

    def __make_coffee(self):
        self.__grind_coffee()
        self.__boil_water()
        return self.__coffee_is_prepared and self.__water_is_boiled

    def __grind_coffee(self):
        self.__coffee_is_prepared = True

    def __boil_water(self):
        self.__water_is_boiled = True

if __name__ == "__main__":
    coffeeMaker = CoffeeMachine()

    print(coffeeMaker.make_coffee())
class CoffeeMachine {
    #coffeeIsPrepared = false;
    #waterIsBoiled = false;

    makeCoffee(): boolean {
        this.#grindCoffee();
        this.#boilWater();

        return this.#coffeeIsPrepared && this.#waterIsBoiled;
    }

    #grindCoffee(): void {
        this.#coffeeIsPrepared = true;
    }

    #boilWater(): void {
        this.#waterIsBoiled = true;
    }
}

const coffeeMaker = new CoffeeMachine();

console.log(coffeeMaker.makeCoffee()); // Выведет: true
public class CoffeeMachine {
    private boolean coffeeIsPrepared = false;
    private boolean waterIsBoiled = false;

    public boolean makeCoffee() {
        grindCoffee();
        boilWater();

        return coffeeIsPrepared && waterIsBoiled;
    }

    private void grindCoffee() {
        coffeeIsPrepared = true;
    }

    private void boilWater() {
        waterIsBoiled = true;
    }
}

public class Program {
    public static void main(String[] args) {
        CoffeeMachine coffeeMaker = new CoffeeMachine();

        System.out.println(coffeeMaker.makeCoffee()); // Выведет: true
    }
}
class CoffeeMachine {
    private var coffeeIsPrepared = false
    private var waterIsBoiled = false

    fun makeCoffee(): Boolean {
        grindCoffee()
        boilWater()

        return coffeeIsPrepared && waterIsBoiled
    }

    private fun grindCoffee() {
        coffeeIsPrepared = true
    }

    private fun boilWater() {
        waterIsBoiled = true
    }
}

fun main() {
    val coffeeMaker = CoffeeMachine()

    println(coffeeMaker.makeCoffee()) // Выведет: true
}

Четыре принципа рядом

Принципы ООП создают основу для качественного кода:

Принцип Преимущество Пример
Наследование Иерархии классов, повторное использование Автомобиль → Грузовик
Полиморфизм Единый интерфейс для разных объектов Кнопка «Включить»
Инкапсуляция Защита данных Банкомат
Абстракция Упрощение сложных систем Кофемашина

Домашнее задание

  • Создайте иерархию TransportCar, Bicycle, Airplane.
  • Реализуйте use_device(device) для Television, Microwave, Radio.
  • Создайте класс BankAccount с приватными полями и проверкой PIN.