Principio de inversión de dependencias#

  • Última modificación: Mayo 14, 2022

Se debe depender de abstracciones y no de concreciones

Implementación que viola el principio#

[ ]:
class ScikitLearnModel:
    def fit(self):
        pass


class TensorFlowModel:
    def fit(self):
        pass

class PyTorchModel:
    def fit(self):
        pass



class ModelTrainer:
    #
    # Este modelo es una abstracción pero depende de la implementación concreta
    #
    def __init__(self, model_type):
        if model_type == 'scikitlearnmodel':
            self.model = ScikitLearModel()
        elif model_type == 'pytorchmodel':
            self.model = PyTorchModel()
        else:
            self.model == TensorFlowModel()

    def fit(self):
        self.model.fit()

Solución#

[ ]:
from abc import ABC, abstractmethod


class Model(ABC):
    @abstractmethod
    def train(self):
        raise NotImplementedError


class ModelTrainer:
    def __init__(self, model: Model):
        self.model = model

    def fit(self):
        self.model.train()


class ScikitLearnModel(Model):
    def fit(self):
        pass


class TensorFlowModel(Model):
    def fit(self):
        pass


class PytorchModel(Model):
    def fit(self):
        pass


model_of_the_day = PytorchModel()
model_trainer_of_day = ModelTrainer(model_of_the_day)

Generalización de la solución#

[ ]:
import os


def main():
    model_type = os.environ["MODEL_TYPE"]
    if model_type == "scikitlearnmodel":
        self.model = ScikitLearModel()
    elif model_type == "pytorchmodel":
        self.model = PyTorchModel()
    elif model_type == "tensorflowmodel":
        self.model == TensorFlowModel()
    else:
        raise Exception