paint-brush
Gjuha juaj e parë e programimit ndikon shumë në mënyrën se si mendoni për kodinnga@nfrankel
308 lexime
308 lexime

Gjuha juaj e parë e programimit ndikon shumë në mënyrën se si mendoni për kodin

nga Nicolas Fränkel6m2025/02/02
Read on Terminal Reader

Shume gjate; Te lexosh

Programimi i orientuar nga objekti, trashëgimia dhe nëntipi mund të kenë kuptime specifike që nuk përkthehen në gjuhë të tjera, në varësi të gjuhës së parë që mësoni.
featured image - Gjuha juaj e parë e programimit ndikon shumë në mënyrën se si mendoni për kodin
Nicolas Fränkel HackerNoon profile picture


Java është gjuha e parë që mësova në karrierën time. Struktura e saj është themelore në vitet e mia të para të të kuptuarit të koncepteve të programimit. Pasi kalova disa gjuhë të tjera me qasje shumë të ndryshme, unë e zgjerova këndvështrimin tim. Sot dua të reflektoj mbi idenë e trashëgimisë .

Trashëgimia në Java

Në Java, ideja e trashëgimisë është e lidhur ngushtë me konceptin e nëntipit . Nëntipi është zbatimi i një marrëdhënieje IS A. Për shembull, klasa Rabbit është një nënlloj i klasës Mammal . Tani e tutje, një shembull Rabbit ka të gjithë sjelljen e një Mammal : ai trashëgon sjelljen.


Për shkak të kësaj, ju mund të kaloni një shembull Rabbit kur një metodë kërkon një parametër Mammal ose të ktheni një shembull Rabbit kur një lloj i kthimit të metodës është Mammal . Nëse keni mësuar Java, .Net ose ndonjë gjë të ngjashme nga distanca, kjo është mënyra se si e shihni trashëgiminë dhe ajo bëhet normale e re.


Është trashëgimi e qartë .


 class Animal { void feed(); } class Rabbit extends Animal { //1 }
  1. Për shkak se një Rabbit IS A Animal , ai mund të feed()

Trashëgimia në Go

Kur shikova për herë të parë Go, u habita që nuk kishte nëntipe, ndërkohë që ende ofron trashëgimi. Go përdor shtypjen e rosës:


Nëse duket si një rosë, noton si një rosë dhe shaka si një rosë, atëherë ndoshta është.


Nëse një struct Go zbaton të njëjtat funksione si një ndërfaqe, ajo zbaton në mënyrë implicite ndërfaqen.


 type Animal interface { feed() //1 } type Rabbit struct { } func (rabbit Rabbit) feed() { //2 // feeds }
  1. Një Animal mund të ushqehet
  2. Për shkak se ekziston një funksion feed() që merr një Rabbit si parametër, Rabbit zbaton Animal


Nuk më pëlqen Go për qasjen e tij të trajtimit të gabimeve, por kisha dy mendje për zbatimin e nënkuptuar. Nga njëra anë, kuptova se ishte një koncept i ri dhe u përpoqa të qëndroja mendjehapur; nga ana tjetër, mendoj se gjërat janë gjithmonë më mirë të qarta sesa të nënkuptuara, qoftë në zhvillimin e softuerit apo në jetën reale.

Trashëgimia në Python

Python është gjuha më interesante që njoh në lidhje me trashëgiminë.


Nëntipi dhe trashëgimia e bazuar në tip kanë qenë të pranishme në Python që nga fillimi i tij.


 class Animal: def feed(self): #1 pass #2 class Rabbit(Animal): #3 pass
  1. Një Animal mund të ushqehet
  2. Nuk ka klasa abstrakte dhe as ndërfaqe në Python, vetëm klasa
  3. Për shkak se një Rabbit IS A Animal , ai mund të feed()


Në këtë drejtim, Python funksionon njësoj si Java për sa i përket trashëgimisë. Python gjithashtu ofron shtypjen e rosës, të cilën e përshkrova si metoda magjike . Për shembull, për të bërë diçka të përsëritur , p.sh. , që mund të kthejë një përsëritës , ju duhet vetëm të zbatoni __iter__() dhe __next__() :


 class SingleValueIterable(): done = False def __init__(self, value): self.value = value def __iter__(self): #1 return self def __next__(self): #1 if self.done: raise StopIteration else: self.done = True return self.value svi = SingleValueIterable(5) sviter = iter(svi) #2 for x in sviter: print(x) #3
  1. Metodat e shtypjes së rosës
  2. Krijo një Iterator - Pythons e di se si që kur ne kemi zbatuar metodat e mësipërme
  3. Printo 5


Problemi me këtë qasje të shtypjes së rosës është se funksionon vetëm për metodat magjike të paracaktuara të Python. Po sikur të dëshironi të ofroni një klasë që një palë e tretë mund ta trashëgojë në mënyrë implicite?


 class Animal: def feed(): pass class Rabbit: def feed(): pass


Në fragmentin e mësipërm, Rabbit nuk është një Animal , që na shqetëson shumë. Futni PEP 544 , të titulluar Protokollet: Nëntipi strukturor (shtypja statike e rosës). PEP zgjidh pamundësinë e përcaktimit të metodave magjike për klasat tona. Ai përcakton një klasë të thjeshtë Protocol : pasi të trashëgoni prej saj, metodat e përcaktuara në klasë bëhen të pranueshme për shtypjen e rosës, prandaj emri - shtypje statike duck.


 from typing import Protocol class Animal(Protocol): #1 def feed(): #2 pass class Rabbit: def feed(): #2 pass class VenusFlytrap: def feed(): #2 pass
  1. Trashëgimi nga Protocol
  2. Për shkak se Animal është një Protocol , çdo klasë që përcakton feed() bëhet një Animal , për mirë ose për keq

konkluzioni

Programimi i orientuar nga objekti, trashëgimia dhe nëntipi mund të kenë kuptime specifike që nuk përkthehen në gjuhë të tjera, në varësi të gjuhës së parë që mësoni. Java e reklamon veten si një gjuhë e orientuar drejt objekteve dhe ofron paketën e plotë. Go nuk është një gjuhë OO, por gjithsesi ofron nënshtypje nëpërmjet shkrimit duck. Python ofron trashëgimi të qartë dhe të nënkuptuar, por jo ndërfaqe.


Ju mësoni një gjuhë të re programimi duke e krahasuar atë me atë që njihni tashmë. Njohja e veçorive të një gjuhe është çelësi për të shkruar kodin idiomatik në gjuhën tuaj të synuar. Njihuni me veçoritë që nuk ekzistojnë në gjuhët tuaja të njohura: ato do të zgjerojnë kuptimin tuaj të programimit në tërësi.


Shkoni më tej:




Botuar fillimisht në A Java Geek më 26 janar 2025