Написание конвертера, дизайн в ООП - PullRequest
0 голосов
/ 10 апреля 2019

Я разрабатываю конвертер, который конвертирует вес, длину и объем.Я предпочитаю описывать это ООП способом, однако я не уверен насчет:

1. Каким должен быть конвертер класса:?Тип (вес, длина, объем)или единица (галлон, унция, метр ..)?

2. Поскольку значения from и to различаются для разных типов, у меня не может быть метода "convert" для применения полиморфизма, но верно ли это?

3.Пожалуйста, также спроектируйте драйверкод

4. преобразование в основном один лайнер, стоит ли ставить его в рамках ООП?Я вижу, что ООП - это способ оставаться организованным и гибким

Спасибо.

Вот как это выглядит сейчас:

ConverterBase(object) # with attributes type, from, to
    if type == 'weight':
        if from == 'kg' and to == 'lb':
            kg_to_lib
        elif from == 'lb' and to == 'g':
            lb_to_g
    if type == 'length':
        if from == 'mile' and to =='km':
            milt_to_km
        elif from == 'm' and to == 'feet':
            m_to_feet
    if type == 'volume'
        if from =='oz' and to == 'gallon':
            oz_to_gallon
        if from == 'liter' and to == 'oz':
            liter_to_oz

1 Ответ

0 голосов
/ 10 апреля 2019

Один из возможных подходов (Java):

interface AbstractUnitConverter<U> {
    double convert(double quantity, U unitFrom, U unitTo);
}

class WeightConverter implements AbstractUnitConverter<WeightConverter.Unit> {
    private static final double KG_TO_LB_FACTOR = 2.20462;

    @Override
    public double convert(double quantity, Unit unitFrom, Unit unitTo) {

        switch (unitFrom) {
            case kg:
                switch (unitTo) {
                    case kg:    return quantity;
                    case lb:    return KG_TO_LB_FACTOR * quantity;
                    default: throw new UnsupportedOperationException();
                }
            case lb:
                switch (unitTo) {
                    case kg:    return quantity / KG_TO_LB_FACTOR;
                    case lb:    return quantity;
                    default: throw new UnsupportedOperationException();
                }
            default: throw new UnsupportedOperationException();
        }
    }

    enum Unit {
        kg, lb;
    }
}

class LengthConverter implements AbstractUnitConverter<LengthConverter.Unit> {
    @Override
    public double convert(double quantity, Unit unitFrom, Unit unitTo) {
        // similar to weight
    }

    enum Unit {
        km, mile;
    }
}

public static void main(String[] args) {
    WeightConverter weightConverter = new WeightConverter();
    System.out.println(weightConverter.convert(60, Unit.kg, Unit.lb));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...