Indlela yokusebenzisa izimiso ze-SOLID ku-Python isinyathelo ngesinyathelo

  • Izimiso ze-SOLID zinikeza isisekelo esicacile sokuklama ikhodi ye-Python efundeka kalula, enakekelwayo, futhi ekwazi ukulinganiswa.
  • Isimiso ngasinye (i-SRP, i-OCP, i-LSP, i-ISP, kanye ne-DIP) sibhekana nohlobo oluthile lwenkinga yokuklama, kusukela emithwalweni ehlukene kabi kuya ekuxhomekeni okuqinile.
  • Ukusebenzisa i-SOLID ngezigaba, izifinyezo, kanye nokufakwa kokuxhomekeka ku-Python kunciphisa ukuhlangana, kuthuthukisa ukuhlolwa, futhi kusiza ekuguqukeni kohlelo.

Iqinile ku-Python

Uma uqala ukusebenza kumaphrojekthi amakhulu ePython, enye yezinto zokuqala oziqaphelayo ukuthi Ikhodi iba nzima ukuyiqonda, ukuyihlola, kanye nokuyelula. Uma ungalandeli imithetho embalwa eyisisekelo yokuklama. Yilapho-ke izimiso ezidumile ze-SOLID zingena khona: iqoqo lemikhuba emihle eyenzelwe ukwenza impilo yeqembu ibe lula kakhulu.

Lezi zimiso zaqala emkhakheni we- uhlelo oluqondiswe ezintweni zakudala (i-Java, i-C++, i-C#, njll.)Kodwa zihambisana kahle ne-Python uma nje usebenzisa amakilasi nezinto ngendlela engathi sína kakhulu. Ake sibheke ngokuningiliziwe ukuthi ziyini, zivelaphi, kungani zibalulekile, futhi, ngaphezu kwakho konke, kanjani Faka i-SOLID ngezibonelo ezicacile ku-Python ukwenza ikhodi yakho ihlale ihlelekile, ikhuliswe, futhi kube mnandi ukusebenza nayo.

Kuyini i-SOLID futhi konke kuvelaphi?

Leli gama I-SOLID isifinyezo esathandwa kakhulu yi-Michael Feathers ukuqoqa izimiso zokuklama ezinhlanu ezaphakanyiswa ekuqaleni nguRobert C. Martin, owaziwa kakhulu ngokuthi uMalume Bob. Lo njiniyela wesofthiwe waseMelika, omunye wabasayini be-Agile Manifesto, washicilela isihloko esithi "Izimiso ze-OOD" maphakathi nawo-90s kanye kamuva "Izimiso Zokuklama Namaphethini Okuklama," lapho abeka khona izisekelo eziningi zomklamo wanamuhla ogxile ezintweni.

Ngokuhamba kwesikhathi, abanye ababhali abafana UBarbara Liskov noBertrand Meyer Baphinde banikela ngemibono ehlanganiswe kulolu hlelo lwezimiso. UMichael Feathers wayenomqondo (ohlakaniphile kakhulu) wokuzihlela kabusha ukuze izinhlamvu zokuqala zakhe igama elithi SOLID, elabasiza ukuba basakazeke njengomlilo wasendle emphakathini othuthukayo.

Izinhlamvu ezinhlanu ze-SOLID zihambisana nalezi zimiso zokuklama eziqondiswe ezintweni, ezisebenza naku-Python:

  • S - Isimiso Somthwalo Wemfanelo Oyedwa (Isimiso Somthwalo Wemfanelo Oyedwa)
  • O - Isimiso Esivulekile/Esivaliwe (Isimiso Esivulekile/Esivaliwe)
  • L – Isimiso Sokufaka Esikhundleni sikaLiskov (Isimiso Sokufaka Esikhundleni sikaLiskov)
  • I - Isimiso Sokuhlukaniswa Kwesixhumi (Isimiso Sokuhlukaniswa Kwezixhumi)
  • D - Isimiso Sokuguqulwa Kokuxhomekeka (Isimiso Sokuguqulwa Kokuxhomekeka)

Umqondo ojwayelekile uwukuthi lezi zimiso ezinhlanu, ezisetshenziswa ndawonye, Bakusiza ukuthi ubhale isofthiwe eguquguqukayo, elula ukuyihlola, futhi enakekelwayoLokhu kuholela ekusetshenzisweni okusheshayo, ukuncipha kwamaphutha ayimfihlakalo, ukusetshenziswa kabusha kwekhodi okungcono, kanye nokuncipha kwamakhanda lapho iphrojekthi isikhiqize iminyaka embalwa.

Yiziphi izimiso ze-SOLID ezisetshenziswa ku-Python?

Ukusebenzisa izimiso ze-SOLID ku-Python akuyona nje umsebenzi wezemfundo; kunomthelela oqondile emsebenzini wansuku zonke weqembu. Uma ulandela lezi zimiso, Zinciphisa ikhodi ye-spaghetti, zinciphise iphunga lekhodi, futhi zivimbele i-codebase yakho ukuthi "inganuki ukubola."kusetshenziswa isifaniso esidumile, “uma kunuka kabi, kukhona okuklanywe kabi.” Ku-Windows, abathuthukisi abaningi bakhetha ukwenza kanjalo Faka futhi ulungiselele i-WSL2 ukuze kube nendawo ye-Linux eseduze nokukhiqizwa.

Ezindaweni zokubambisana (amaqembu okuthuthukisa i-backend, ubunjiniyela bedatha, imikhiqizo enemijikelezo emide, njll.) lezi zimiso ziyisihluthulelo sokwenza Abantu abaningi bangasebenza ku-codebase efanayo ngaphandle kokweqa imingcele yabo noma ukwephula yonke into ngokuthinta okuncane.Ngaphezu kwalokho, i-Python, yize iguquguquka futhi inamandla, ivumela ukusetshenziswa okungenamthungo kwezifinyezo ezijwayelekile ze-OOP: amakilasi angabonakali, amazinga efa, ukwakheka, kanye nezixhumi ngokusebenzisa abc, Njll

Ngamafuphi, i-SOLID ikusiza ukufeza:

  • Ikhodi ehlanzekile, efundeka kalulangisho nangemva kweminyaka eminingi ngiyibhalile.
  • Ukuhlolwa okuthuthukisiwengoba imithwalo yemfanelo ihlukaniswe ngokusobala.
  • Ukuphinda kusetshenziswe futhi kukhule kakhulu ngenxa yokuxhomekeka okuncane okuqinile phakathi kwamamojula.
  • Amaphutha ambalwa okuqinisekisaUma ushintsha okuthile kumojuli eyodwa, awuphuli ngengozi ezinye izinto ezinhlanu.

S - Isimiso Somthwalo Wemfanelo Oyedwa

Isimiso sokuqala sithi Ikilasi kufanele libe nesizathu esisodwa sokushintsha.Ngamanye amazwi, kumele ithathe umthwalo wemfanelo owodwa, ochazwe kahle. Lokhu akusho ukuthi kufanele ibe nendlela eyodwa kuphela, kodwa kunalokho yonke imicabango yayo kufanele ibhekisele enhlosweni eyodwa, ehambisanayo.

Cabanga ngekilasi le-Python elimele umsebenzisi futhi, ngaphezu kokugcina idatha yakhe, liphinde liphathe ukufinyelela kusizindalwazi nokukhiqiza imibiko:

class User:
    def __init__(self, name: str):
        self.name = name

    def get_user_from_database(self, user_id: int) -> dict:
        # Recupera datos desde la base de datos
        # ...
        pass

    def save_user_to_database(self) -> None:
        # Persiste el usuario en la base de datos
        # ...
        pass

    def generate_user_report(self) -> str:
        # Genera un informe del usuario
        # ...
        pass

Nasi ikilasi ihlanganisa imithwalo yemfanelo emithathu ehlukeneUkumela umsebenzisi, ukuphatha ukuphikelela, kanye nokwakha imibiko. Izinguquko kusizindalwazi, ifomethi yombiko, noma izimfanelo zomsebenzisi zidinga ukuguqulwa kwesigaba esifanayo, okwandisa ingozi yokwethula iziphazamiso ezihlanganisayo.

Uma sihlukanisa lezi zinkinga, umklamo uthuthuka kakhulu:

class User:
    def __init__(self, name: str):
        self.name = name


class UserDB:
    @staticmethod
    def get_user(user_id: int) -> User:
        # Lógica para obtener usuarios de la base de datos
        # ...
        return User("John Doe")

    @staticmethod
    def save_user(user: User) -> None:
        # Lógica para guardar el usuario
        # ...
        pass


class UserReportGenerator:
    @staticmethod
    def generate_report(user: User) -> str:
        # Lógica para generar informes de usuario
        # ...
        return f"Report for user: {user.name}"

Manje ikilasi Umsebenzisi umelela umsebenzisi njengenhlangano kuphelaUma indlela imibiko ekhiqizwa ngayo izinguquko, vele uthephe UserReportGeneratorUma ushintsha isizindalwazi, umane uthinte UserDBIkilasi ngalinye linesizathu esisodwa sokushintsha, okwenza kube lula ukulungisa amaphutha kanye nokuvela kwesistimu.

I-SRP isetshenziswe esibonelweni esingokoqobo: amadada nokuxhumana

Ake sibheke isimo esijwayelekile esilungisiwe: ikilasi Idada Ekuqaleni, imithwalo yemfanelo yenezelwa kancane kancane kuze kube yilapho iba yisilo esinzima ukusinakekela. Cabanga ngokusetshenziswa okungenalwazi:

class Duck:
    def __init__(self, name: str):
        self.name = name

    def fly(self) -> None:
        print(f"{self.name} is flying not very high")

    def swim(self) -> None:
        print(f"{self.name} swims in the lake and quacks")

    def do_sound(self) -> str:
        return "Quack"

    def greet(self, other_duck: "Duck") -> None:
        print(f"{self.name}: {self.do_sound()}, hello {other_duck.name}")

Ikilasi Kufanele ichazwe kalula ngokuthi “idada”Kodwa futhi ilawula indlela abaxhumana ngayo. Uma kusasa ushintsha umqondo wengxoxo (imishwana eminingi, ezinye izilimi, iziteshi ezahlukene), kufanele ushintshe ikilasi ledada, elivele lisebenza kahle njengenhlangano.

Isixazululo esihlonipha i-SRP ukukhipha lowo mthwalo wemfanelo wesibili kwelinye ikilasi eligxile kwezokuxhumana:

class Duck:
    def __init__(self, name: str):
        self.name = name

    def fly(self) -> None:
        print(f"{self.name} is flying not very high")

    def swim(self) -> None:
        print(f"{self.name} swims in the lake and quacks")

    def do_sound(self) -> str:
        return "Quack"


class Communicator:
    def __init__(self, channel: str):
        self.channel = channel

    def communicate(self, duck1: Duck, duck2: Duck) -> None:
        sentence1 = f"{duck1.name}: {duck1.do_sound()}, hello {duck2.name}"
        sentence2 = f"{duck2.name}: {duck2.do_sound()}, hello {duck1.name}"
        conversation = 
        print(*conversation, f"(via {self.channel})", sep="\n")

Ngenxa yalokhu kuhlukana, Ungathuthukisa indlela yokuxhumana ngaphandle kokuthinta incazelo yedadaNgaphezu kwalokho, ikhodi kulula ukuyihlola: uhlola ukuziphatha kwe Duck futhi ngakolunye uhlangothi, lowo we Communicatorngaphandle kokuxuba imithwalo yemfanelo.

O - Isimiso Esivulekile/Esivaliwe

Umgomo we-OCP uthi Izinhlangano zesofthiwe kufanele zivulekele ukwandisa ukuziphatha kwazo, kodwa zivaliwe ekuguqulweni okuqondile.Ngamanye amazwi, uma ufuna ukwengeza ukusebenza okusha, kungcono ukuthi ungadingi ukubhala kabusha amakilasi asevele esebenza futhi asetshenziswa amanye amamojula.

Isibonelo esivamile ukubala izindawo zezibalo zejiyometri. Ake siqale sibheke inguqulo ayihloniphi i-OCP:

class Rectangle:
    def __init__(self, width: float, height: float):
        self.width = width
        self.height = height


class Circle:
    def __init__(self, radius: float):
        self.radius = radius


class AreaCalculator:
    def calculate_area(self, shape) -> float:
        if isinstance(shape, Rectangle):
            return shape.width * shape.height
        elif isinstance(shape, Circle):
            return 3.14159 * shape.radius * shape.radius
        else:
            raise ValueError("Forma no soportada")

Uma ufuna ukwengeza unxantathu kusasa, uzophoqeleka ukuthi shintsha ikhodi ye AreaCalculatorukwengeza okunye elifLokhu kwephula i-OCP, ngoba ikilasi "alisavaliwe" ezinguqukweni.

Inguqulo efanele ihilela ukwethula isifinyezo Shape ngendlela area() okuyinto umuntu ngamunye ayifezayo ngendlela yakhe:

from abc import ABC, abstractmethod


class Shape(ABC):
    @abstractmethod
    def area(self) -> float:
        pass


class Rectangle(Shape):
    def __init__(self, width: float, height: float):
        self.width = width
        self.height = height

    def area(self) -> float:
        return self.width * self.height


class Circle(Shape):
    def __init__(self, radius: float):
        self.radius = radius

    def area(self) -> float:
        return 3.14159 * self.radius * self.radius


class AreaCalculator:
    def calculate_area(self, shape: Shape) -> float:
        return shape.area()

Ngenxa yalo mklamo, engeza unxantathu ongawuthinti AreaCalculatorUmane udale iklasi elincane elisha:

class Triangle(Shape):
    def __init__(self, base: float, height: float):
        self.base = base
        self.height = height

    def area(self) -> float:
        return 0.5 * self.base * self.height

Umgomo we-Open/Closed uhambisana kahle nomqondo wokuthi chaza amaphuzu acacile okwelulwa ngokusebenzisa izifinyezo: izinkundla zokuxhumana, amakilasi angaqondakali, izingwegwe, njll. Ku-Python, imodyuli abc Ikuvumela ukuthi uveze lokhu ngokucacile, noma ngabe ulimi lushintshashintsha.

I-OCP isetshenziswa esibonelweni sokuxhumana

Uma sibuyela esibonelweni sika Oxhumana nayeSingathatha isinyathelo esengeziwe futhi silungiselele umklamo ukuze usekele izinhlobo ezahlukene zezingxoxo ngaphandle kokubhala kabusha i-communicator isikhathi ngasinye. Ukuze senze lokhu, sichaza isifinyezo sengxoxo bese sivumela i-communicator ukuthi isebenzise yona kuphela:

from typing import final
from abc import ABC, abstractmethod


class AbstractConversation(ABC):
    @abstractmethod
    def do_conversation(self) -> list:
        pass


class SimpleConversation(AbstractConversation):
    def __init__(self, duck1: Duck, duck2: Duck):
        self.duck1 = duck1
        self.duck2 = duck2

    def do_conversation(self) -> list:
        sentence1 = f"{self.duck1.name}: {self.duck1.do_sound()}, hello {self.duck2.name}"
        sentence2 = f"{self.duck2.name}: {self.duck2.do_sound()}, hello {self.duck1.name}"
        return 


class Communicator:
    def __init__(self, channel: str):
        self.channel = channel

    @final
    def communicate(self, conversation: AbstractConversation) -> None:
        print(*conversation.do_conversation(), f"(via {self.channel})", sep="\n")

Kule nguqulo, Uma ufuna ukwengeza indlela entsha yokukhuluma (isibonelo, ingxoxo enolaka, ingxoxo ethatha ithuba, njll.), umane udala elinye iqembu elincane AbstractConversation. Indlela communicate() de Communicator Akushintshi, kuhambisana ne-OCP njengoba kuchaziwe.

L – Isimiso Sokufaka Esikhundleni sikaLiskov

Isimiso Sokufaka Esisekelweni sikaLiskov, esakhiwe nguBarbara Liskov, sithi Ama-subclass kufanele akwazi ukufaka esikhundleni ama-base class awo ngaphandle kokushintsha indlela okulindeleke ngayo uhlelo.Empeleni, lokhu kusho ukuthi uma ikhodi isebenza ngesibonelo esisodwa sekilasi eliyisisekelo, kufanele isebenze kahle nanoma yisiphi isibonelo sekilasi elincane.

Isibonelo esijwayelekile sokwephulwa kwe-LSP ukwenza amamodeli kuzo zonke izinyoni ngendlela eyodwa fly()kufaka phakathi izintshe:

class Bird:
    def fly(self) -> None:
        pass


class Duck(Bird):
    def fly(self) -> None:
        print("¡El pato está volando!")


class Ostrich(Bird):
    def fly(self) -> None:
        # Las avestruces no vuelan
        raise NotImplementedError("Las avestruces no pueden volar")

Noma iyiphi ikhodi ecabanga ukuthi Yonke inyoni ekwazi ukundiza izohluleka uma ithola intshe. Lokho kusho, Ostrich Akuyona into efanelekile esikhundleni salokho Bird, ngaleyo ndlela kwephulwa i-LSP.

Isixazululo ukulungisa uhlu lwezigaba ukuze lubonise kangcono iqiniso: akuzona zonke izinyoni ezindizayo, ngakho-ke Ingxenye eyodwa kuphela yezinyoni okufanele ibe nendlela fly():

class Bird:
    pass


class FlyingBird(Bird):
    def fly(self) -> None:
        pass


class Duck(FlyingBird):
    def fly(self) -> None:
        print("¡El pato está volando!")


class Ostrich(Bird):
    # No vuela, así que no implementa fly()
    pass

Ngalo mklamo, Noma yimuphi umsebenzi odinga inyoni endizayo uzosho ukuthi uyawudinga. FlyingBirdfuthi ngeke ithole intshe. Ngale ndlela, i-LSP iyahlonishwa futhi okuhlukile kwesikhathi sokusebenza okungalindelekile kuyagwenywa.

Izingxoxo ze-LSP nezinyoni

Uma sibuyela esibonelweni sezingxoxo, kuvamile ukuqala ukubhala ikhodi ucabanga ngamadada kuphela bese ufuna ukwengeza amagwababa noma ezinye izinyoni. Uma ikilasi lengxoxo lincike ku Duck, Ngeke ukwazi ukuyisebenzisa kabusha nezinye izinhlobo zezinyoni ngaphandle kokuthinta ikhodi:

class Crow:
    # Implementación específica del cuervo
    ...

Si SimpleConversation Ibhalwe ngezinhlobo zamadada kuphela; awukwazi nje ukudlulisa igwababa ngaphandle kokulishintsha. Indlela efanele ukudala isifinyezo esivamile. Bird futhi wenze ingxoxo incike kulokho okucashuniwe:

from abc import ABC, abstractmethod


class Bird(ABC):
    def __init__(self, name: str):
        self.name = name

    @abstractmethod
    def do_sound(self) -> str:
        pass


class Crow(Bird):
    def do_sound(self) -> str:
        return "Caw"


class Duck(Bird):
    def do_sound(self) -> str:
        return "Quack"


class SimpleConversation(AbstractConversation):
    def __init__(self, bird1: Bird, bird2: Bird):
        self.bird1 = bird1
        self.bird2 = bird2

    def do_conversation(self) -> list:
        sentence1 = f"{self.bird1.name}: {self.bird1.do_sound()}, hello {self.bird2.name}"
        sentence2 = f"{self.bird2.name}: {self.bird2.do_sound()}, hello {self.bird1.name}"
        return 

Ngale ndlela, noma yiliphi iqembu elincane Bird ohlonipha inkontileka (do_sound()(igama, njll.) kuyinto esikhundleni esivumelekile futhi ngeke kuphule ukuziphatha okulindelekile kwe SimpleConversation.

I - Isimiso Sokuhlukaniswa Kwesixhumi

Umgomo we-ISP uthi Akukho khasimende okufanele liphoqwe ukuthi lithembele ezindleleni elingazisebenzisi.Kuhunyushwe kwaba amakilasi noma ama-interface angaqondakali, lokhu kusho ukuthi kungcono ukuba nama-interface amaningana amancane, athile kune-interface eyodwa enkulu, ejwayelekile.

Qaphela lo mklamo lapho isikhombimsebenzisi Worker Kudinga ukuthi bonke labo abakusebenzisayo babe nezindlela ezithile zokusebenza kanye nokudla:

from abc import ABC, abstractmethod


class Worker(ABC):
    @abstractmethod
    def work(self) -> None:
        pass

    @abstractmethod
    def eat(self) -> None:
        pass


class Human(Worker):
    def work(self) -> None:
        print("El humano está trabajando")

    def eat(self) -> None:
        print("El humano está comiendo")


class Robot(Worker):
    def work(self) -> None:
        print("El robot está trabajando")

    def eat(self) -> None:
        # El robot no come, pero está obligado a declarar este método
        pass

Ikilasi Irobhothi lithembele endleleni ethile eat() lokho akudingiNoma yiluphi ushintsho oluhlobene nokudla luzothinta irobhothi, noma ngabe aluhlobene nalokho kuziphatha.

Ngokusebenzisa i-ISP, sihlukanise i-interface ibe yizimbili ezincane nezicacile:

class Workable(ABC):
    @abstractmethod
    def work(self) -> None:
        pass


class Eatable(ABC):
    @abstractmethod
    def eat(self) -> None:
        pass


class Human(Workable, Eatable):
    def work(self) -> None:
        print("El humano está trabajando")

    def eat(self) -> None:
        print("El humano está comiendo")


class Robot(Workable):
    def work(self) -> None:
        print("El robot está trabajando")

Manje, Ikilasi ngalinye lisebenzisa kuphela izindlela elizidingayo ngempela.Lokhu kunciphisa ukuhlanganiswa, kwenza kube lula ukuvela komklamo, futhi kwenza ikhodi izwakale kakhudlwana: kuba sobala kakhulu ukuthi ubani ongenzani.

I-ISP ekubunjweni kwezinyoni: ukundiza nokubhukuda

Kwenzeka okufanayo lapho kwenziwa amamodeli ezinyoni ezindizayo futhi zibhukuda. Uma ukucashunwa okuyisisekelo Bird Kudinga ukusebenzisa kokubili fly() njengoba swim()Uzogcina unezifundo ezifana Crow okumele benze sengathi bayakwazi ukubhukuda:

class Bird(ABC):
    def __init__(self, name: str):
        self.name = name

    @abstractmethod
    def fly(self) -> None:
        pass

    @abstractmethod
    def swim(self) -> None:
        pass

    @abstractmethod
    def do_sound(self) -> str:
        pass

Isixazululo ngokusho kwe-ISP yilesi hlukanisa isikhombikubona sibe amakhono athile kakhulu:

class Bird(ABC):
    def __init__(self, name: str):
        self.name = name

    @abstractmethod
    def do_sound(self) -> str:
        pass


class FlyingBird(Bird):
    @abstractmethod
    def fly(self) -> None:
        pass


class SwimmingBird(Bird):
    @abstractmethod
    def swim(self) -> None:
        pass


class Crow(FlyingBird):
    def fly(self) -> None:
        print(f"{self.name} is flying high and fast!")

    def do_sound(self) -> str:
        return "Caw"


class Duck(SwimmingBird, FlyingBird):
    def fly(self) -> None:
        print(f"{self.name} is flying not very high")

    def swim(self) -> None:
        print(f"{self.name} swims in the lake and quacks")

    def do_sound(self) -> str:
        return "Quack"

Uma uke wanquma ukwenza imodeli yephenguin, mane nje umenza azuze ifa SwimmingBird kepha hhayi kusuka FlyingBirdFuthi ngeke kudingeke usebenzise izindlela ezingenalutho noma ulahle okuhlukile kokwenziwa.

D - Isimiso Sokuguqulwa Kokuxhomekeka

Isimiso sokugcina, i-DIP, singafingqwa ngemibono emibili eyinhloko: Amamojula asezingeni eliphezulu akufanele ancike kumamojula asezingeni eliphansi; womabili kufanele ancike ezintweni ezifinyeziwe.Futhi izifinyezo akufanele zincike emininingwaneni, kodwa kunalokho imininingwane kufanele incike ezifinyezweni.

Empeleni, lokhu kusho ukuthi i-logic yebhizinisi lakho akufanele ixhunywe emininingwaneni ethile efana nokuthi "Ngisebenzisa i-MySQL," "Ngibhalela ifayela lendawo," noma "Ngithumela imiyalezo ye-SMS nalo mhlinzeki." Esikhundleni salokho, uchaza izixhumi ezingabonakali (ngokwesibonelo, Database, Channel, NotificationService) futhi wenza ikhodi yakho yezinga eliphezulu ikhulume nabo kuphela.

Umklamo ukuthi phula i-DIP Lokhu kungaba yindawo yokugcina yomsebenzisi efaka ngqo i-database ye-MySQL:

class MySQLDatabase:
    def connect(self) -> None:
        # Conectar a MySQL
        pass

    def query(self, sql: str) -> list:
        # Ejecutar consulta
        return []


class UserRepository:
    def __init__(self) -> None:
        self.database = MySQLDatabase()  # Dependencia directa

    def get_users(self) -> list:
        return self.database.query("SELECT * FROM users")

Uma unquma ukusebenzisa i-PostgreSQL kusasa, kufanele shintsha ikilasi lezinga eliphezulu UserRepositoryUxhumene nemininingwane ethile yokusetshenziswa.

Ngokusebenzisa i-DIP, siqala ngokuchaza ukuhlukaniswa kwedatha bese sithola ukuqaliswa kokhonkolo okuvela kukho:

from abc import ABC, abstractmethod


class Database(ABC):
    @abstractmethod
    def connect(self) -> None:
        pass

    @abstractmethod
    def query(self, sql: str) -> list:
        pass


class MySQLDatabase(Database):
    def connect(self) -> None:
        # Conexión a MySQL
        pass

    def query(self, sql: str) -> list:
        # Consulta en MySQL
        return []


class PostgreSQLDatabase(Database):
    def connect(self) -> None:
        # Conexión a PostgreSQL
        pass

    def query(self, sql: str) -> list:
        # Consulta en PostgreSQL
        return []


class UserRepository:
    def __init__(self, database: Database) -> None:
        self.database = database  # Depende de una abstracción

    def get_users(self) -> list:
        return self.database.query("SELECT * FROM users")

Ngale ndlela, Ungafaka noma yikuphi ukusetshenziswa kwe Database lapho udala indawo yokugcina, ngaphandle kokuthinta ikhodi yayo yangaphakathi:

mysql_db = MySQLDatabase()
user_repo = UserRepository(mysql_db)

postgres_db = PostgreSQLDatabase()
user_repo = UserRepository(postgres_db)

Le ndlela yaziwa ngokuthi Umjovo Wokuncika Futhi kuyindlela evame kakhulu yokusebenzisa i-DIP: amakilasi awadali ukuncika kwawo, kodwa athola kusuka ngaphandle (ngomakhi noma ngezindlela ezithile), esebenzisa njalo izifinyezo njengohlobo.

I-DIP isetshenziswa eziteshini nakubaxhumanisi

Esibonelweni sezingxoxo zezinyoni, singathuthukisa nokuphathwa kweziteshi ngokusebenzisa i-DIP. Ake sithi uchaza isifinyezo esisodwa sesiteshi kanye nesinye sesikhulumi:

class AbstractChannel(ABC):
    @abstractmethod
    def get_channel_message(self) -> str:
        pass


class AbstractCommunicator(ABC):
    @abstractmethod
    def get_channel(self) -> AbstractChannel:
        pass

    @final
    def communicate(self, conversation: AbstractConversation) -> None:
        print(*conversation.do_conversation(),
              self.get_channel().get_channel_message(),
              sep="\n")

Ukuqaliswa kokuqala, okungenalwazi kungaba:

class SMSChannel(AbstractChannel):
    def get_channel_message(self) -> str:
        return "(via SMS)"


class SMSCommunicator(AbstractCommunicator):
    def __init__(self) -> None:
        self._channel = SMSChannel()  # Depende de detalle concreto

    def get_channel(self) -> AbstractChannel:
        return self._channel

Nakuba kubonakala kulungile, Lo mxhumanisi usaxhunyaniswe ngqo SMSChannelSithuthukise umklamo ngokuba ne-communicator ithole isiteshi sivela ngaphandle (ukufakwa kokuthembela), ngakho-ke sincike kuphela ekususeni:

class SimpleCommunicator(AbstractCommunicator):
    def __init__(self, channel: AbstractChannel) -> None:
        self._channel = channel

    def get_channel(self) -> AbstractChannel:
        return self._channel

Ngale ndlela, noma yisiphi isiteshi esisha (i-imeyili, izaziso ze-push, njll.) siyasetshenziswa AbstractChannel y Ingasetshenziswa ngaphandle kokushintsha ikhodi yokuxhumana.Futhi, amakilasi asezingeni eliphezulu ancike ezintweni ezifingqiwe, hhayi emininingwaneni.

Kwenzekani uma ungayinaki i-SOLID?

Uma lezi zimiso zinganakwa, ikhodi ivame ukuhlushwa yizinkinga ezifana nokuthi iphunga lekhodi, ukubola kwekhodi, kanye nokuhlanganiswa okungenakwenzeka ukukuqaqaOkusho ukuthi, izigaba ezinkulu ezinemithwalo yemfanelo eyinkulungwane, izigaba ezincane eziphula izinkontileka, ukuncika okuphindaphindiwe, kanye nezindlela ezishintsha nsuku zonke ngoba zenza izinto eziningi kakhulu.

Imiphumela icacile futhi ibuhlungu kakhulu kunoma yiliphi iqembu: Ubuthakathaka obengeziwe, amaphutha amaningi, ukuvuselelwa njalo, futhi, esimweni esibi kakhulu, ikhodi egcina ingasetshenziswa.Yilokho okuvame ukubizwa ngokuthi "ikhodi yespaghetti": kunzima ukukulandela, kugcwele ama-patches, futhi cishe akunakwenzeka ukuwelula ngaphandle kokuphula into ebalulekile.

Izimiso ze-SOLID azikabekwa phansi, futhi akusizi ngaso sonke isikhathi ukuzisebenzisa ngokuqinile, ikakhulukazi ekwenzeni ama-prototyping ngokushesha noma kumaphrojekthi amancane kakhulu. Noma kunjalo, Zikhumbule futhi uzisebenzise ekwakhiweni kwakho okuningi okugxile ezintweni ku-Python. Kwenza umehluko phakathi kwephrojekthi ekhula ngokuhamba kwesikhathi kanye nephrojekthi ewohlokayo ngokushesha nje lapho ikhula kancane.

Ama-IDE angcono kakhulu wokuhlela Windows 11
I-athikili ehlobene:
Ama-IDE angcono kakhulu wokuhlela Windows 11

Engeza njengomthombo okhethwayo ku-Google