Чӣ гуна принсипҳои SOLID-ро дар асоси таҷрибаи худ фаҳмед?
sobes.tech AI
Ҷавоб аз AI
SOLID — маҷмӯи панҷ принсипи тарҳи объектӣ-ба асоси (OOD), ки кӯмак мекунанд дар сохтани системаҳои чандир, васеъшаванда ва ба осонӣ нигоҳдошташаванда. Аз таҷрибаи худ, ман ҳар принсипро чунин мефаҳмам:
-
S - Single Responsibility Principle (Принсипи масъулияти ягона): Ҳар синф бояд танҳо як сабаб барои тағир додан дошта бошад. Ин маъно дорад, ки синф бояд танҳо барои як функсия ё қисми муайяни системаи масъул бошад. Ин кӯмак мекунад дар фаҳмидани синф, санҷиш ва тағир додани он, бо кам кардани таъсироти тарафӣ при тағирот.
class ReportGenerator { // Масъулияти асосӣ: тавлиди ҳисобот public void generateReport(Data data) { // Логикаи тавлиди ҳисобот } // Нақз кардани SRP: агар ин синф ҳам дар нигоҳ доштани ҳисобот машғул бошад // public void saveReport(Report report) { /* ... */ } } -
O - Open/Closed Principle (Принсипи кушодан/банд будан): Ҳамчун объектҳо (синфҳо, модулҳо, функсияҳо ва ғ.) бояд барои васеъшавӣ кушода бошанд, аммо барои тағирот баста бошанд. Ин тавассути истифодаи абстраксияҳо (интерфейсҳо, синфҳои абстрактӣ) ва полиморфизм ба даст меояд. Функционалияти нав бо эҷоди реализацияҳои нав барои абстраксияҳои мавҷуда илова карда мешавад, бе тағир додани коди мавҷуда.
interface Shape { double calculateArea(); } class Circle implements Shape { private double radius; public Circle(double radius) { this.radius = radius; } @Override public double calculateArea() { return Math.PI * radius * radius; } } class Square implements Shape { private double side; public Square(double side) { this.side = side; } @Override public double calculateArea() { return side * side; } } class AreaCalculator { // Кушод барои васеъшавӣ: метавон тӯри нав илова кард, бе тағир додани ин метод public double calculateTotalArea(Shape[] shapes) { double totalArea = 0; for (Shape shape : shapes) { totalArea += shape.calculateArea(); } return totalArea; } } -
L - Liskov Substitution Principle (Принсипи ивазшавии Лисков): Подтипҳо бояд пурра ивазкунандаи типҳои асосӣ бошанд. Ин маъно дорад, ки коде, ки бо типи асосӣ кор мекунад, бояд бо ҳар подтипаш дуруст кор кунад, бе ниёз ба донистани реализацияи мушаххас. Дар амал, ин маъно дорад, ки синфҳои наследӣ набояд шартҳои асосиро вайрон кунанд, ки дар асосӣ муайян шудаанд.
class Rectangle { protected int width; protected int height; public void setWidth(int width) { this.width = width; } public void setHeight(int height) { this.height = height; } public int getArea() { return width * height; } } class SquareLSP extends Rectangle { @Override public void setWidth(int width) { this.width = width; this.height = width; // Вайрон кардани LSP, агар муштарӣ интизор бошад, ки танзимоти васеъ ва баландӣ мустақил аст } @Override public void setHeight(int height) { this.width = height; this.height = height; // Вайрон кардани LSP } } -
I - Interface Segregation Principle (Принсипи ҷудо кардани интерфейс): Муштариён набояд аз интерфейсҳое вобаста бошанд, ки онҳо истифода намебаранд. Беҳтар аст, ки бисёр интерфейсҳои хурд ва махсус дошта бошанд, на як интерфейси калони "мӯйсафед". Ин кам кардани вобастагиро таъмин мекунад ва имкон медиҳад, ки синфҳо танҳо функсияҳое, ки воқеан заруранд, иҷро кунанд.
interface Worker { // Интерфейси "мӯйсафед" void work(); void eat(); void sleep(); } interface Workable { // Интерфейсҳои ҷудошуда void work(); } interface Feedable { void eat(); } interface Sleepable { void sleep(); } class HumanWorker implements Workable, Feedable, Sleepable { // Иҷрои ҳамаи интерфейсҳои зарурӣ // ... } class RobotWorker implements Workable { // Иҷрои танҳо Workable, вобаста нест ба Feedable ва Sleepable // ... } -
D - Dependency Inversion Principle (Принсипи ивазкунии вобастагиҳо):
- Модулҳои сатҳи боло набояд ба модулҳои сатҳи поён вобаста бошанд. Ҳарду бояд ба абстраксияҳо вобаста бошанд.
- Абстраксияҳо набояд ба тафсилотҳо вобаста бошанд. Тафсилотҳо бояд ба абстраксияҳо вобаста бошанд. Ин принсип аксар вақт тавассути истифодаи dependency injection амалӣ мешавад, ки дар он вобастагиҳои синф аз берун таъмин карда мешаванд, на аз ҷониби худи синф. Ин кам кардани вобастагиро таъмин мекунад ва тестро осон мекунад.
// Нақз кардани DIP: HighLevelModule мустақиман ба LowLevelModule вобаста аст class LowLevelModule { public void doLowLevelStuff() { /* ... */ } } class HighLevelModule { private LowLevelModule lowLevel = new LowLevelModule(); // вобастагии мустақим public void doHighLevelStuff() { lowLevel.doLowLevelStuff(); } } // Иҷрои DIP: ҳарду вобаста ба абстраксия interface Service { void execute(); } class ConcreteService implements Service { @Override public void execute() { /* тафсилоти реализация */ } } class ClientModule { private final Service service; // вобастагии аз абстраксия // вобастагиро даромад мекунад (масалан, тавассути конструктор) public ClientModule(Service service) { this.service = service; } public void doSomething() { service.execute(); // бо абстраксия кор мекунад } }