Wpis z mikrobloga

  • 1
#pytanie #programowanie

Mireczki i Mirabełkanki, dawno nie pisałem w #python i zapomniałem. Mam taki legacy kod, który ma między innymi:

KlasaA(metaklasa/interfejs)
KlasaB(list)
KlasaC(KlasaB)
KlasaD(KlasaB, KlasaA)
KlasaE(KlasaA, KlasaC)

W klasach D i E jest sporo zduplikowanego kodu, ktory potrzebuje dołożenia jednej funkcjonalności.

class D(...):
....def a(self, a1, a2,...)
....def b
....def c

class E(...)
....def a(self, a1, a2, ...)
....def b
....def c

Same abc nie są duże i sama (nie)potrzebna "dobra zmiana" też malutka ( ͡º ͜ʖ͡º)

Oczywiscie, mogę przekazać do init'a D i E dodatkowy parametr (nowy_ficzer=False) i odpowiednio zmodyfikować obie klasy.

Jednak, choć nie jestem w stanie przepisać całości (tysiące/dziesiątki tysiecy linii kodu), wkurza mnie ta duplikacja i chciałem sobie przypomnieć jak bym to dawniej rozwiązał, ale napotkałem page_fault ( ͡° ʖ̯ ͡°)

Z krótkich poszukiwań na necie i w mojej pamieci:
1. Moglbym dołożyć do mro kolejną klasę do dziedziczenia
2. Kompozycja, gdzie np w inicie ustawiam,
self.a = self.better_a if (nowy_ficzer) else self.old_a
3. Mógłbym wyjąć a z obu klas do zwykłych globalnych funkcji modułu i dalej jak w punkcie 2
4. Mógłbym trzymać te kilka funkcji w jakieś klasie typu utils (tyle że i tak są już zbyt duże, trzymały by kolejny obiekt x (co prawda redukując a,b,c)
5. dekorator do metod w klasach (czyli w zasadzie to co w 2 tylko w runtime, zamiast podczas init'a)
6. Nie pamietam co robiło abc / abstract base class i czy by mi pomogło,
7. Za cholerę nie pamietam też meta-klas ale też pewnie by można spakować D i E do DE i stworzyć z nich inne D i E

Z grubsza to wszystko co mi przychodzi do głowy. Ma ktoś inne pomysły?

Końcowo, chciałbym by ficzer był jak najmniej "intruzywny", oraz wywalić nieco duplikacji, nie powiększać zbytnio zależności.
  • Odpowiedz