Как лучше спроектировать приложение?

Решил написать небольшое приложение на питоне с целью закрепить полученные знания. Во время написания кода почитал про ООП и решил сделать все более абстрактно, в чем собственно и прошу помочь.
Приложение по крону обращается к сервису, авторизуется, получает json с данными. Json содержит данные:

{
    "data": [{
        "Conception": 'Shop1',
        "Delivery.IsDelivery": "ORDER_WITHOUT_DELIVERY",
        "DishDiscountSumInt": 0,
        "DishDiscountSumInt.average": 0,
        "OpenDate.Typed": "2016-01-11T00:00:00",
        "UniqOrderId.OrdersCount": 2
    }, {
        "Conception": "Shop2",
        "Delivery.IsDelivery": "DELIVERY_ORDER",
        "DishDiscountSumInt": 18895,
        "DishDiscountSumInt.average": 2699.29,
        "OpenDate.Typed": "2016-01-11T00:00:00",
        "UniqOrderId.OrdersCount": 7
    }, {
        "Conception": "Shop2",
        "Delivery.IsDelivery": "ORDER_WITHOUT_DELIVERY",
        "DishDiscountSumInt": 63376,
        "DishDiscountSumInt.average": 358.06,
        "OpenDate.Typed": "2016-01-11T00:00:00",
        "UniqOrderId.OrdersCount": 177
    }],
    "summary": [
        [{
            "Conception": null,
            "OpenDate.Typed": "2016-01-11T00:00:00"
        }, {
            "DishDiscountSumInt": 0,
            "DishDiscountSumInt.average": 0,
            "UniqOrderId.OrdersCount": 2
        }],
        [{
            "Conception": "Shop2",
            "Delivery.IsDelivery": "DELIVERY_ORDER"
        }, {
            "DishDiscountSumInt": 18895,
            "DishDiscountSumInt.average": 2699.29,
            "UniqOrderId.OrdersCount": 7
        }],
        [
            {}, {
                "DishDiscountSumInt": 82271,
                "DishDiscountSumInt.average": 442.32,
                "UniqOrderId.OrdersCount": 186
            }
        ],
        [{
            "Conception": "Shop2",
            "Delivery.IsDelivery": "ORDER_WITHOUT_DELIVERY"
        }, {
            "DishDiscountSumInt": 63376,
            "DishDiscountSumInt.average": 358.06,
            "UniqOrderId.OrdersCount": 177
        }],
        [{
            "Conception": null,
            "Delivery.IsDelivery": "ORDER_WITHOUT_DELIVERY"
        }, {
            "DishDiscountSumInt": 0,
            "DishDiscountSumInt.average": 0,
            "UniqOrderId.OrdersCount": 2
        }],
        [{
            "Conception": "Shop2"
        }, {
            "DishDiscountSumInt": 82271,
            "DishDiscountSumInt.average": 447.13,
            "UniqOrderId.OrdersCount": 184
        }],
        [{
            "OpenDate.Typed": "2016-01-11T00:00:00"
        }, {
            "DishDiscountSumInt": 82271,
            "DishDiscountSumInt.average": 442.32,
            "UniqOrderId.OrdersCount": 186
        }],
        [{
            "Conception": null
        }, {
            "DishDiscountSumInt": 0,
            "DishDiscountSumInt.average": 0,
            "UniqOrderId.OrdersCount": 2
        }],
        [{
            "Conception": "Shop2",
            "Delivery.IsDelivery": "DELIVERY_ORDER",
            "OpenDate.Typed": "2016-01-11T00:00:00"
        }, {
            "DishDiscountSumInt": 18895,
            "DishDiscountSumInt.average": 2699.29,
            "UniqOrderId.OrdersCount": 7
        }],
        [{
            "Conception": "Shop2",
            "Delivery.IsDelivery": "ORDER_WITHOUT_DELIVERY",
            "OpenDate.Typed": "2016-01-11T00:00:00"
        }, {
            "DishDiscountSumInt": 63376,
            "DishDiscountSumInt.average": 358.06,
            "UniqOrderId.OrdersCount": 177
        }],
        [{
            "Conception": "Shop2",
            "OpenDate.Typed": "2016-01-11T00:00:00"
        }, {
            "DishDiscountSumInt": 82271,
            "DishDiscountSumInt.average": 447.13,
            "UniqOrderId.OrdersCount": 184
        }],
        [{
            "Conception": null,
            "Delivery.IsDelivery": "ORDER_WITHOUT_DELIVERY",
            "OpenDate.Typed": "2016-01-11T00:00:00"
        }, {
            "DishDiscountSumInt": 0,
            "DishDiscountSumInt.average": 0,
            "UniqOrderId.OrdersCount": 2
        }]
    ]
}


Далее приложению нужно спарсить все это дело, сформировать сообщение и отправить в Slack.

На данный момент у меня все реализовано так:
есть класс Conceptions:
class Conception:
    # Класс хранит в себе название, показатели доставки и локальных продаж
    def __init__(self, n):
        self.name = n
        self.delivery = ['Доставка', {'sum': 0, 'chq': 0, 'avg': 0}]
        self.notdelivery = ['Прилавок', {'sum': 0, 'chq': 0, 'avg': 0}]

    def setname(self, newname):
        self.name = newname

    def set_values_d(self, s, c, a):
        self.delivery[1]['sum'] = s
        self.delivery[1]['chq'] = c
        self.delivery[1]['avg'] = a

    def set_values_nd(self, s, c, a):
        self.notdelivery[1]['sum'] = s
        self.notdelivery[1]['chq'] = c
        self.notdelivery[1]['avg'] = a

    def __str__(self):
        return 'Концепция: {0}\n''Доставка: {1}\n''Прилавок: {2}'. \
            format(self.name, self.delivery, self.notdelivery)


Есть функции:
getReport() - получает данные от сервиса и парсит json;
setValue() - формирует список концепций со значениями;
sentMsg() - формирует нужный json и отправляет сообщение в Slack.

Вопросы:
1) Правильно ли я спроектировал все?
2) Можно ли что-то улучшить?
  • Вопрос задан
  • 266 просмотров
Решения вопроса 1
@akonovalov
Программист на компьютере
  1. pep8, как уже упоминалось.
  2. Класс для "Концепции" - да, хорошая идея, если надо делать какие-то отдельные методы, но иногда можно обойтись и простым словарём. Почему атрибуты delivery и notdelivery - списки, если они в коде нигде не расширяются, по ним нет никаких итераций? Очевидно, какую-то часть бизнес-логики вы здесь забыли указать.
  3. Метод setname - реально нужен и используется?
  4. В методах set_values_d и set_values_nd вы присваиваете значения первому индексу. Он точно есть на момент вызова этих методов? Может, всё это можно было сделать в конструкторе?
  5. Константы в коде - плохо. Потом сами же забудете, например, почему self.notdelivery[1] а не self.notdelivery[0] или опечатаетесь и присвоите значение по ключу 'cng' вместо 'chg' и т.д
  6. А что если у сервиса поменяется формат выдачи данных? ИМХО нужна валидация - все ли поля обязательные "приехали", нет ли ошибок в значениях и пр.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы