Фото Келлі Сіккема на Unsplash
Уявіть, що ви проектуєте флоту космічних кораблів для міжгалактичної місії. Кожен корабель має унікальні характеристики, такі як розмір, колір та тип двигуна, але всі вони мають спільні риси, як-от здатність до запуску, навігації та причалювання.
У програмуванні об'єктно-орієнтоване програмування (OOP) дозволяє організувати ваш код подібним чином — групуючи пов'язані властивості та поведінки в об'єкти, як проектуючи кожен космічний корабель.
Чотири основні принципи OOP для космічних кораблів
Чотири основні принципи об'єктно-орієнтованого програмування (OOP) — це Інкапсуляція, Наслідування, Поліморфізм та А абстракція. Ці принципи працюють разом, щоб сприяти створенню модульного, повторно використовуваного та підтримуваного коду. Ось розбір кожного з них:
1. Інкапсуляція
Об'єднання даних (атрибутів) та методів (функцій), які працюють з даними, в одну одиницю (клас), одночасно обмежуючи прямий доступ до внутрішніх деталей.
Інкапсуляція схожа на об'єднання систем управління і двигунів космічного корабля в одну самодостатню одиницю. Всі важливі деталі знаходяться всередині корабля, а ви взаємодієте з ним через його пульт управління.
class SpaceShip {
// Приватна властивість (доступна тільки всередині класу)
#fuelLevel;
constructor(name, fuelLevel) {
this.name = name; // Публічна властивість
this.#fuelLevel = fuelLevel; // Приватна властивість
}
// Публічний метод для взаємодії з приватною властивістю
launch() {
if (this.#fuelLevel > 0) {
console.log(`${this.name} is launching!`);
this.#fuelLevel -= 10; // Зменшуємо рівень палива
} else {
console.log(`${this.name} doesn't have enough fuel to launch.`);
}
}
// Публічний метод для перевірки рівня палива
getFuelLevel() {
return `${this.name} has ${this.#fuelLevel} units of fuel left.`;
}
}
// Приклад використання:
const falcon = new SpaceShip("Falcon", 100);
falcon.launch(); // Falcon is launching!
console.log(falcon.getFuelLevel()); // Falcon has 90 units of fuel left.
2. Наслідування
Створення нового класу, який успадковує властивості та поведінки від існуючого класу.
Наслідування дозволяє нам повторно використовувати шаблони для різних типів космічних кораблів. Наприклад, CargoShip та PassengerShip можуть успадковувати спільні риси від класу SpaceShip, але мати свої унікальні особливості.
// Батьківський клас
class SpaceShip {
constructor(name, speed) {
this.name = name;
this.speed = speed;
}
navigate() {
console.log(`${this.name} is navigating at ${this.speed} km/s.`);
}
}
// Дочірній клас: CargoShip
class CargoShip extends SpaceShip {
constructor(name, speed, currentCargo) {
super(name, speed); // Викликаємо конструктор батьківського класу
this.currentCargo = currentCargo; // Поточна вага вантажу
}
loadCargo(weight) {
this.currentCargo += weight;
console.log(`${this.name} loaded ${weight} tons of cargo. Total cargo: ${this.currentCargo} tons.`);
}
}
// Дочірній клас: PassengerShip
class PassengerShip extends SpaceShip {
constructor(name, speed, passengerCount) {
super(name, speed); // Викликаємо конструктор батьківського класу
this.passengerCount = passengerCount;
}
boardPassengers(count) {
this.passengerCount += count;
console.log(
`${this.name} is boarding ${count} passengers. Total passengers: ${this.passengerCount}.`
);
}
}
// Приклад використання:
const cargoShip = new CargoShip("Galactic Hauler", 10, 500);
cargoShip.navigate(); // Galactic Hauler is navigating at 10 km/s.
cargoShip.loadCargo(200); // Galactic Hauler loaded 200 tons of cargo. Total cargo: 700 tons.
cargoShip.loadCargo(350); // Galactic Hauler loaded 350 tons of cargo. Total cargo: 1050 tons.
const passengerShip = new PassengerShip("Stellar Voyager", 15, 50);
passengerShip.navigate(); // Stellar Voyager is navigating at 15 km/s.
passengerShip.boardPassengers(20); // Stellar Voyager is boarding 20 passengers.
## 3. Поліморфізм
Дозволяє об'єктам набувати **різних форм**, що дає змогу одному інтерфейсу представляти різні поведінки.
Поліморфізм дозволяє космічним кораблям вести себе по-різному, при цьому зберігаючи спільний інтерфейс. Наприклад, усі кораблі можуть мати метод _navigate()_, але спосіб його роботи може варіюватися — один корабель може використовувати автопілот, в той час як інший вимагає ручного керування.
// Батьківський клас
class SpaceShip {
constructor(name) {
this.name = name;
}
navigate() {
console.log(${this.name} is navigating through space.
);
}
}
// Дочірній клас: AutopilotShip
class AutopilotShip extends SpaceShip {
navigate() {
console.log(${this.name} is navigating using autopilot.
);
}
}
// Дочірній клас: ManualControlShip
class ManualControlShip extends SpaceShip {
navigate() {
console.log(${this.name} requires manual controls to navigate.
);
}
}
// Дочірній клас: AIControlledShip
class AIControlledShip extends SpaceShip {
navigate() {
console.log(${this.name}'s AI is calculating the safest route.
);
}
}
// Приклад використання:
const genericShip = new SpaceShip("Generic Cruiser");
const autopilotShip = new AutopilotShip("Auto Pilot One");
const manualShip = new ManualControlShip("Manual Voyager");
const aiShip = new AIControlledShip("AI Explorer");
// Поліморфізм в дії
const ships = [genericShip, autopilotShip, manualShip, aiShip];
ships.forEach((ship) => ship.navigate());
// Виведення:
// Generic Cruiser is navigating through space.
// Auto Pilot One is navigating using autopilot.
// Manual Voyager requires manual controls to navigate.
// AI Explorer's AI is calculating the safest route.
```
4. Абстракція
Приховування складних деталей реалізації і відкриття лише основних функцій.
Абстракція приховує складні механізми роботи двигунів космічного корабля. Вам не потрібно знати всі деталі — достатньо натискання кнопки для запуску. Точно так само OOP приховує внутрішні механізми об'єкта, дозволяючи вам взаємодіяти з ним простим способом.
class SpaceShip {
constructor(name) {
this.name = name;
}
// Приватний метод (внутрішня складність)
#calculateThrust() {
return "Calculating optimal thrust...";
}
// Публічний метод (простий інтерфейс)
launch() {
console.log(`${this.name} is launching.`);
console.log(this.#calculateThrust()); // Приховує складність
}
}
// Приклад використання:
const voyager = new SpaceShip("Voyager");
voyager.launch();
// Voyager is launching.
// Calculating optimal thrust...
Висновок
Об'єктно-орієнтоване програмування (OOP) революціонізувало розробку програмного забезпечення, ввівши парадигму, що відображає реальні сутності та взаємодії. Дотримуючись основних принципів OOP — інкапсуляції, наслiдування, поліморфізму та абстракції — OOP дозволяє розробникам створювати системи, які є модульними, перезавантажуваними, масштабованими та легкими для підтримки.
Інкапсуляція забезпечує цілісність даних, наслідування сприяє повторному використанню коду та логічним ієрархіям, поліморфізм дозволяє створювати гнучкі та динамічні поведінки, а абстракція спрощує складність, фокусуючи увагу на основних функціях. Разом ці принципи дозволяють розробникам моделювати складні системи інтуїтивно, розбиваючи їх на керовані, самодостатні об'єкти, які співпрацюють для досягнення функціональності.
В кінцевому підсумку, освоєння OOP — це не лише навчання синтаксису, а й прийняття мислення, яке ставить на перший план чисту архітектуру, співпрацю та перспективу на майбутнє. Використовуючи ці принципи, розробники можуть створювати надійне, адаптоване програмне забезпечення, яке еволюціонує з урахуванням змінюваних вимог, забезпечуючи довговічність і ефективність у світі, що постійно змінюється.
Перекладено з: Building Spaceships with Object-Oriented Programming