Principio de sustitución de la interfase#

  • Última modificación: Mayo 14, 2022

Caso 1#

Código inicial

assets/isp-0.png

[1]:
class DataGenerator:
    #
    # Funciones no relacionadas con posibles acoplamientos
    # colaterales indeseados
    #
    def gen_images(self):
        print("Running DataGenerator.gen_images()")
        return "generated images"

    def gen_text(self):
        print("Running DataGenerator.gen_text()")
        return "generated text"

    def gen_rows(self):
        print("Running DataGenerator.gen_rows()")
        return "generated rows"


def image_featurizer():
    images = DataGenerator().gen_images()
    print("Running image_featurizer()")
    return "featurized images"


def text_featurizer():
    text = DataGenerator().gen_text()
    print("Running text_featurizer()")
    return "featurized text"


def row_featurizer():
    rows = DataGenerator().gen_rows()
    print("Running row_featurizer()")
    return "featurized rows"
[2]:
image_featurizer()
Running DataGenerator.gen_images()
Running image_featurizer()
[2]:
'featurized images'
[3]:
text_featurizer()
Running DataGenerator.gen_text()
Running text_featurizer()
[3]:
'featurized text'
[4]:
row_featurizer()
Running DataGenerator.gen_rows()
Running row_featurizer()
[4]:
'featurized rows'

Separación inicial

assets/isp-1.png

[5]:
class DataGenerator:
    def gen_images(self):
        print("Running DataGenerator.gen_images()")
        return "generated images"

    def gen_text(self):
        print("Running DataGenerator.gen_text()")
        return "generated text"

    def gen_rows(self):
        print("Running DataGenerator.gen_rows()")
        return "generated rows"


class ImageGenerator(DataGenerator):
    def gen_images(self):
        print("Running ImageGenerator.gen_images()")
        return super().gen_images()


class TextGenerator(DataGenerator):
    def gen_text(self):
        print("Running TextGenerator.gen_text()")
        return super().gen_text()


class RowGenerator(DataGenerator):
    def gen_rows(self):
        print("Running RowsGenerator.gen_rows()")
        return super().gen_rows()


def image_featurizer():
    images = ImageGenerator().gen_images()
    print("Running image_featurizer()")
    return "featurized images"


def text_featurizer():
    texts = TextGenerator().gen_text()
    print("Running text_featurizer")
    return "featurized text"


def row_featurizer():
    rows = RowGenerator().gen_rows()
    print("Running row_featurizer")
    return "featurized rows"
[6]:
image_featurizer()
Running ImageGenerator.gen_images()
Running DataGenerator.gen_images()
Running image_featurizer()
[6]:
'featurized images'
[7]:
text_featurizer()
Running TextGenerator.gen_text()
Running DataGenerator.gen_text()
Running text_featurizer
[7]:
'featurized text'
[8]:
row_featurizer()
Running RowsGenerator.gen_rows()
Running DataGenerator.gen_rows()
Running row_featurizer
[8]:
'featurized rows'

Separación completa

assets/isp-2.png

[9]:
class TextDataGenerator:
    def gen_text(self):
        print("Running TextDataGenerator.gen_text()")
        return "generated text"

    def gen_rows(self):
        print("Running TextDataGenerator.gen_rows()")
        return "generated rows"


class TextGenerator(TextDataGenerator):
    def gen_text(self):
        print("Running TextGenerator.gen_text()")
        return super().gen_text()


class RowGenerator(TextDataGenerator):
    def gen_rows(self):
        print("Running RowsGenerator.gen_rows()")
        return super().gen_rows()


class ImageDataGenerator:
    def gen_images(self):
        print("Running ImageDataGenerator.gen_images()")
        return "generated images"


class ImageGenerator(ImageDataGenerator):
    def gen_images(self):
        print("Running ImageGenerator.gen_images()")
        return super().gen_images()


def image_featurizer():
    images = ImageGenerator().gen_images()
    print("Running image_featurizer()")
    return "featurized images"


def text_featurizer():
    texts = TextGenerator().gen_text()
    print("Running text_featurizer")
    return "featurized text"


def row_featurizer():
    rows = RowGenerator().gen_rows()
    print("Running row_featurizer")
    return "featurized rows"
[10]:
image_featurizer()
Running ImageGenerator.gen_images()
Running ImageDataGenerator.gen_images()
Running image_featurizer()
[10]:
'featurized images'
[11]:
text_featurizer()
Running TextGenerator.gen_text()
Running TextDataGenerator.gen_text()
Running text_featurizer
[11]:
'featurized text'
[12]:
row_featurizer()
Running RowsGenerator.gen_rows()
Running TextDataGenerator.gen_rows()
Running row_featurizer
[12]:
'featurized rows'