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

☄ Глубокое погружение в объектно-ориентированное программирование: Часть 2

В последнем посте мы начали с основ объектно-ориентированного программирования. Мы сделали наш первый урок…. С пометкой “учебник”, “новички”, “ооп”, “java”.

В последнем посте мы начали с основ объектно-ориентированного программирования. Мы сделали наш первый урок. Добавил в него некоторые члены и методы и инициализировал объект класса Car. Теперь пришло время погрузиться глубже.

Ранее мы определили метод повторного топливного бака для увеличения расхода топлива в нашем автомобиле. Теперь, когда у меня есть объект car, никто не мешает мне изменить значение оставшееся топливо без использования метода топливный бак . Я могу напрямую получить доступ к члену с помощью оператора точки и изменить его значение:

car.fuelLeft = 500;

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

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

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

Чтобы кто-то не смог волшебным образом изменить участника fuel Left , мы добавим ключевое слово private перед его определением в классе. Это предотвратит доступ к нему с помощью оператора dot.

// Car.java
private Integer fuelLeft;

Но это создает другую проблему. В нашем методе main мы использовали элемент топливо слева для вывода значения. Не для того, чтобы волшебным образом изменить значение, а просто для того, чтобы взглянуть на его значение.

//Main.java

// ERROR!
System.out.println(honda.fuelLeft);
honda.refuelTank(100);
System.out.println(honda.fuelLeft);

Выполнение приведенного выше кода выдаст нам сообщение об ошибке. Чтобы сохранить функциональность для просмотра данных, мы создадим метод “получения” в классе Car:

// Car.java

int getFuelLeft() {
    return fuelLeft;
}

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

System.out.println(honda.getFuelLeft());
honda.refuelTank(100);
System.out.println(honda.getFuelLeft());

И вуаля! Все работает, как и раньше, с дополнительной безопасностью, чтобы не менять оставшееся топливо участника волшебным образом.

Рефакторинг Других Участников

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

public class Car {
    private String name;
    private String color;
    private Integer peopleCapacity;
    private Integer fuelLeft;
    private Integer distanceTravelled;

    public String getName() {
        return name;
    }

    public String getColor() {
        return color;
    }

    public Integer getPeopleCapacity() {
        return peopleCapacity;
    }

    public Integer getFuelLeft() {
        return fuelLeft;
    }

    public Integer getDistanceTravelled() {
        return distanceTravelled;
    }
    // other methods...
}

Доступ к методам

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

В последнем посте мы определили наш конструктор как общедоступный . Теперь давайте разберемся в этом. Наш конструктор должен быть доступен из любого места, чтобы инициализировать объект из класса. Следовательно, мы сделали это общедоступным . Давайте теперь определим частный метод. Когда мы запускаем двигатель, автомобиль также проверяет, все ли системы работают в надлежащем состоянии. Давайте назовем этот метод проверка систем . Этот метод не должен использоваться пользователем автомобиля, а просто вызываться внутренне методом StartEngine .

// Car.java

private void checkSystems() {
    System.out.println("Checking Systems...");
}

void startEngine() {
    checkSystems();
    System.out.println("Starting Engine!");
}

Теперь, когда мы вызываем запуск двигателя для объекта car из основного метода, он выведет “Проверка систем…” на. Однако мы не можем получить доступ к методу Контрольные системы извне:

// Main.java

// ERROR
car.checkSystems();

Теперь вы можете задаться вопросом, раньше все члены и методы в классе Car не были ни общедоступными, ни частными; тем не менее мы могли получить к ним доступ. Это почему? Если ничего не упомянуто, делает ли java их общедоступными по умолчанию? Короткий ответ – на самом деле нет. Давайте сделаем шаг назад и разберемся, что такое пакеты в java.

Пакеты

Пакеты в java используются для группировки похожих классов (и подпакетов) вместе. В начале каждого класса java мы указываем имя пакета:

package com.godcrampy.oop_deep_dive;

Обычно, чтобы избежать коллизий имен, компании используют обратные доменные имена в качестве префикса для имени пакета. Итак, если, скажем, у компании есть свой домен как example.com и разрабатывает утилиту для полезных операций со строками, она может назвать ее и разрабатывает утилиту для полезных операций со строками, она может назвать ее . Пакеты также могут содержать подпакеты. Итак, предположим, что в утилите операций со строками есть раздел для генерации случайных имен. В этом случае он может находиться в пакете с именем com.example.string_util.random_name

Все файлы классов структурированы в каталогах в соответствии с именем пакета. Например, давайте рассмотрим проект java, который я использую для этого урока. Я определил имя пакета как com.godcrampy.oop_deep_dive . Весь исходный код моего проекта находится в папке src/main репозитория со следующей структурой:

    └── src
        └── main
            └── java
                └── com
                    └── godcrampy
                        └── oop_deep_dive
                            ├── Car.java
                            └── Main.java

Теперь давайте переместим наш класс Car в подпакет под названием vehicle . Для этого я создал новый каталог под названием транспортное средство и переместил туда класс:

└── src
    └── main
        └── java
            └── com
                └── godcrampy
                    └── oop_deep_dive
                        ├── Main.java
                        └── vehicle
                            └── Car.java

Теперь нам нужно обновить декларации пакетов нашего класса автомобилей. Поэтому я меняю первую строку класса автомобиля с пакета com.godcrampy.oop_deep_dive; на пакет com.godcrampy.oop_deep_dive.транспортное средство;

Теперь, если вы пишете вместе с этим руководством, вы можете заметить, что ваша среда разработки уже начала показывать некоторые ошибки. honda.Запуск двигателя , Хонда.топливный бак и методы honda.drive недоступны в функции main .

Для этих методов мы не добавили общедоступный или частные ключевые слова. Поэтому, когда у элемента или метода не указан модификатор доступа, он получает доступ по умолчанию . Это означает, что к ним можно получить доступ в каком-либо другом классе, только если оба класса находятся в одном пакете. В нашем примере оба Основных и Автомобиль классы были в com.godcrampy.oop_deep_dive пакете. Так что раньше все работало нормально. Поэтому, когда мы переместили Автомобиль в пакет com.godcrampy.oop_deep_dive.vehicle , все методы по умолчанию стали недоступны.

Исправление настроек по умолчанию

Чтобы исправить это, я сделаю все методы по умолчанию в нашем классе автомобилей общедоступными . Итак, наконец, класс автомобилей выглядит так:

package com.godcrampy.oop_deep_dive.vehicle;

public class Car {
    private String name;
    private String color;
    private Integer peopleCapacity;
    private Integer fuelLeft;
    private Integer distanceTravelled;

    public String getName() {
        return name;
    }

    public String getColor() {
        return color;
    }

    public Integer getPeopleCapacity() {
        return peopleCapacity;
    }

    public Integer getFuelLeft() {
        return fuelLeft;
    }

    public Integer getDistanceTravelled() {
        return distanceTravelled;
    }

    public Car(String name, String color, Integer peopleCapacity) {
        this.name = name;
        this.color = color;
        this.peopleCapacity = peopleCapacity;
        this.fuelLeft = 100;
        this.distanceTravelled = 0;
    }

    private void checkSystems() {
        System.out.println("Checking Systems...");
    }

    public void startEngine() {
        checkSystems();
        System.out.println("Starting Engine!");
    }

    public void refuelTank(int fuel) {
        fuelLeft += fuel;
    }

    public void drive(int distance) {
        System.out.println("Driving...");
        distanceTravelled += distance;
    }
}

Теперь все ошибки устранены, и мы готовы к работе. Если вы заметили, в начале класса мы также добавили ключевое слово public: автомобиль общественного класса { . Это следует из тех же правил доступа, которые мы обсуждали ранее.

Вкратце:

Y Частный N N
Y По умолчанию Y N
Y Общественный Y Y
? Защищенный ? ?

Ключевое слово защищено еще предстоит изучить. Мы сделаем это в следующем посте. На этом все для поста заканчивается. Мы поняли, что такое модификаторы доступа и как их можно использовать для повышения безопасности нашего кода. Мы также изучили пакеты на java и то, как организовать наш код. Вы можете найти код, упомянутый в сообщении, здесь: Вы можете найти код, упомянутый в сообщении, здесь:

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

🚀 Ускоренный курс по написанию отсутствующих сценариев оболочки

Сахил Бондре ・ 21 апреля 20 ・ 6 минут чтения

🌟 Я сделал несколько Шпаргалки 🚀 Следуйте за мной дальше Github | Твиттер 📜 Проверьте мой Веб-сайт 😄 Хорошего вам дня!

Оригинал: “https://dev.to/godcrampy/deep-dive-into-object-oriented-programming-part-2-2b4”