Рубрики
Без рубрики

Четыре столпа ООП

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

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

Абстракция

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

abstract class AlgorithmFactory{    
    //what the user of the algorithm sees
    abstract int extremelyComplexProprietaryAlgorithm(int a, int b);    
}
class AlgorithmFactoryImplementation extends AlgorithmFactory{    
    //what the writer of the algorithm sees
    int extremelyComplexProprietaryAlgorithm(int a, int b)
    {
        return a + b * a / b % b % b + a - b * b * a * b * b % a;
    }    
}

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

Объектно-ориентированное программирование пытается смоделировать наше восприятие реальности через отношения между сущностями. Например, автомобиль – это транспортное средство, грузовик – это транспортное средство, а мотоцикл – это транспортное средство. Следовательно, все классы car, truck и motorcycle будут наследовать класс vehicle (или интерфейс). Это не следует путать с композицией, которая описывает отношения. У автомобиля есть колесо, но колесо – это не автомобиль, а автомобиль – это не колесо.

class Vehicle{}
class Car extends Vehicle{}
class Truck extends Vehicle{}
class Motorcycle extends Vehicle{}

Полиморфизм

Этот принцип тесно связан с наследованием и описывает способность объекта относиться к нескольким типам объектов. Если у вас есть класс car, который наследует класс vehicle, объект car можно считать относящимся к типу car и типу vehicle. Если у вас есть метод, который принимает параметр vehicle, но вы передаете параметр car, полиморфизм среды выполнения позволит автоматически принимать его в качестве объекта vehicle при его вызове. Очевидно, что существуют ограничения и исключения, связанные с полиморфизмом, но не позволяйте названию мешать вам понять эту простую концепцию. Когда вы разбиваете слово на его корни, “поли” означает “много”, а “морф” означает “форма” — полиморфизм описывает способность объекта иметь несколько форм одновременно.

class Vehicle{
    public void destroy(){System.out.println("destroying");}
}
class Car extends Vehicle{}
class Truck extends Vehicle{}
class Motorcycle extends Vehicle{}

public class PolymorphismExample
{
    public static void destroyVehicle(Vehicle v)
    {
        v.destroy();
    }
    public static void main(String[] args)
    {
        Car car = new Car();
        Truck truck = new Truck();
        Motorcycle motorcycle = new Motorcycle();
        destroyVehicle(car); //destroying
        destroyVehicle(truck); //destroying
        destroyVehicle(motorcycle); //destroying
    }
}

Инкапсуляция

В объектно-ориентированном программировании считается стандартной практикой делать элементы данных объекта закрытыми и заключать их в методы доступа и мутатора. Если объект car содержит целое число current_gallons, вы можете получить доступ к значению с помощью car.current_gallons. Однако, если вы хотите предотвратить присвоение current_gallons неподходящих значений (например, отрицательных чисел или строк), вам придется фильтровать изменения с помощью getCurrentGallons() (метод доступа) и setCurrentGallons() (метод мутатора). Даже если значение не имеет видимых ограничений, все равно обязательно инкапсулировать элементы данных объекта. Большинство IDE имеют встроенную функцию для автоматической генерации геттеров (средств доступа) и сеттеров (мутаторов).

public class Car{
    public int current_gallons = 20; 
    public String brand = "Honda";     
}
class Car{
    private int current_gallons = 20; 
    private String brand = "Honda";
    public void setCurrentGallons(int new_value)
    {
        if(new_value > 30 || new_value < 0)
            return;
        else
            this.current_gallons = new_value;
    }
    public int getCurrentGallons()
    {
        return current_gallons;
    }    
    public void setBrand(String new_brand)
    {
        if(new_brand.equals("") || new_brand.length() > 10)
            return;
        else
            brand = new_brand;
    }
    public String getBrand()
    {
        return brand;
    }
}

Оригинал: “https://dev.to/paymon123/the-four-pillars-of-object-oriented-programming-from-a-java-perspective-amn”