Estou tentando aplicar o princípio DRY a classes de plotagem de brinquedo como um exercício intelectual para melhorar meu entendimento de POO (atualmente lendo Python Object Oriented programming ), mas intuitivamente parece que o uso de uma hierarquia de herança potencialmente cada vez mais profunda pode levar a uma base de código mais complicada (especialmente porque li que a composição parece ser favorecida em relação à herança, veja Composition over inheritance wiki ). Parece que uma biblioteca de brinquedo poderia potencialmente acabar com muitas classes abstratas como AbstractMonthlyMultiPanelPlot
e AbstractSeasonalPlot
assim por diante para tipos de plotagem arbitrários acomodarem diferentes dados de entrada.
Existe uma maneira mais pythonic de lidar com o problema abaixo que talvez eu esteja esquecendo? Estou violando algum tipo de princípio de design que eu interpretei mal ou talvez tenha simplesmente perdido completamente?
from abc import abstractmethod, ABC
from numpy import ndarray
from typing import List, Tuple
import matplotlib.pyplot as plt
class AbstractPlot(ABC)
@abstractmethod
def plot(self):
raise NotImplementedError
class AbstractMonthlyPlot(AbstractPlot):
@abstractmethod
def plot_for_month(ax, data):
raise NotImplementedError
@property
def n_months(self):
"""number of months in a year"""
return 12
def plot(self, month_to_data: List[Tuple[ndarray]]):
fig, axs = plt.subplots(self.n_months, 1)
for month in range(self.n_months):
self._plot_for_month(ax=axs[month], data=month_to_data[month])
class Contour(AbstractMonthlyPlot):
def _plot_for_month(self, ax, data):
ax.contourf(*data)
class Linear(AbstractMonthlyPlot):
def _plot_for_month(self, ax, data):
ax.plot(*data)
1 respostas