Java 8: ищу шаблон проектирования, чтобы уменьшить дублирование кода - PullRequest
0 голосов
/ 20 июня 2020

У меня следующие тестовые классы. Мне интересно, есть ли шаблон проектирования, который может уменьшить дублирование кода в следующем сценарии.

public abstract class BaseTestClass {

    protected String color;

    protected String type;

    protected Product product;

    abstract void setColor();

    abstract void setClothType();

    abstract Product createTheProduct();

    @BeforeClass
    public void setUp(){
      // there're partial overlaps of "setup" for pants and shirts
    }

    @Test
    public void doATest(){
        testSomethingWithProduct(product);
    }

    @AfterClass
    public void tearDown(){
      // there're partial overlaps of "tearDown" for pants and shirts
    }
}


public class TestBlueShirt extends BaseTestClass {

    @Override
    void setColor() {
        this.color = "blue";
    }

    @Override
    void setClothType() {
        this.type = "shirt";
    }

    @Override
    Product createTheProduct() {
       setColor();
       setClothType();
       // create this.product based on color and type...
    }
}

public class TestRedShirt extends BaseTestClass {}
public class TestBluePants extends BaseTestClass {}
public class TestRedPants extends BaseTestClass {}
...

Вы найдете дублированный код при установке цветов для одного и того же типа ткани или при установке типа для такого же цвета. Мне интересно, как у меня может быть конкретный класс, который может создавать что-то вроде Class<T> (RedShirt, BlueShirt, RedPants и т. Д. c.), И на основе Class<T> я могу напрямую реализовать @Test в базе класс. Так что я могу избежать дублирования кода, насколько это возможно.

что-то вроде:

public abstract class BaseTestClass {

    protected Product product;

    abstract Product createTheProduct(Class<T> ...);

    @BeforeClass
    public void setUp(){
      setUpBasedOnProduct(Class<T> ...);

    }

    @Test
    public void doATest(){
        testSomethingWithProduct(product);
    }

    @AfterClass
    public void tearDown(){
        tearDownBasedOnProduct(Class<T> ...);
    }
}

import ...ClassGenerator

public class TestBlueShirt extends BaseTestClass {
    
    @Override
    createTheProduct(ClassGenerator.createClass("blue", "shirt"));
}

Заранее спасибо!

1 Ответ

3 голосов
/ 20 июня 2020

Вы хотите создать объект, поэтому то, что вы ищете, подпадает под действие шаблонов творческого проектирования. Я не уверен, что он идеально подходит для ваших нужд, но шаблон Factory соответствует некоторым из ваших потребностей.

В типичном случае использования шаблона Factory вы должны указать тип ( как String или перечисление) к методу и получить соответствующий объект. Ваш logi c будет немного сложнее, так как будет несколько входов и несколько ветвлений logi c для определения правильного типа. Например, вы не можете просто использовать «рубашку» String для получения вашего объекта, так как цвет встроен в типы (у вас есть RedShirt, BlueShirt, et c ...).

В заключение, я хотел бы задать себе вопрос, почему RedShirt и BlueShirt должны быть разных типов. Вместо того чтобы использовать шаблон проектирования для решения проблемы, я бы пересмотрел исходный дизайн. Например, вы можете использовать класс Apparel extends Product, содержащий члены color и type, чтобы вы могли запрашивать эту информацию независимо от типа Apparel. Конечно, используйте здравый смысл в зависимости от ситуации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...