Уведомления

Группа в Telegram: @pythonsu

#1 Июль 31, 2015 15:24:00

Stright
От: Кострома
Зарегистрирован: 2015-01-20
Сообщения: 139
Репутация: +  16  -
Профиль   Отправить e-mail  

Вопрос по ООП

Здравствуйте, начал писать программу, которая производит расчет таблиц для проекта.
Каждая таблица - это отдельный класс (Table1, Table2 и т.д.), экземпляры которого обладают методами read(), process() и write(), все таблицы в отдельном модуле tables.
Во втором модуле project - класс Project, который при создании экземпляра создает список классов из модуля tables и рассчитывает выбранные пользователем таблицы.

#  tables.py
class Table1:
    def read(self):
        print('Читаем данные для таблицы 1')
    def process(self):
        print('Обрабатываем данные для таблицы 1')
    def write(self):
        print('Записываем данные таблицы 1')
class Table2:
    def read(self):
        print('Читаем данные для таблицы 2')
    def process(self):
        print('Обрабатываем данные для таблицы 2')
    def write(self):
        print('Записываем данные таблицы 2')
#  project.py
import tables
class Project:
      def __init__(self):
        self.lst_tables = sorted([table for table in tables.__dict__
                                 if not table.startswith('__')])
        self.tables = [tables.__dict__[key]
                       for item in self.lst_tables
                       for key in tables.__dict__
                       if item == key]
        self.choice_dict = {'0': self.tables}
        for num, table in enumerate(self.tables):
            self.choice_dict[str(num + 1)] = table
    def select_table(self):
        print('Введите через запятую, какие таблицы считать?')
        for key in sorted(self.choice_dict):
            if key == '0':
                print('\t{} => {}'.format(key, 'все таблицы'))
            else:
                print('\t{} => {}'.format(key, self.choice_dict[key].__name__))
        self.selected_tables = sorted([num.strip()
                                       for num in input().split(',')])
        self.selected_tables = [num for num in self.selected_tables
                                if num.isdigit()]
    def calculate(self):
        for table in self.selected_tables:
            if isinstance(self.choice_dict.get(table), list):
                for cls in self.choice_dict.get(table):
                    inst = cls()
                    inst.read()
                    inst.process()
                    inst.write()
                break
            else:
                inst = self.choice_dict.get(table)()
                inst.read()
                inst.process()
                inst.write()
if __name__ == '__main__':
    x = Project()
    x.select_table()
    x.calculate()
Подскажите, пожалуйста, правильный ли это подход к организации проекта с точки зрения ООП?
Также выслушал бы замечания и критику по самому коду.

Отредактировано Stright (Июль 31, 2015 15:33:28)

Офлайн

#2 Июль 31, 2015 15:33:33

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Вопрос по ООП

Каждая таблица - это отдельный класс (Table1, Table2 и т.д.)
правильный ли это подход к организации проекта с точки зрения ООП?
Чем эти две класса у вас отличаются? А ничем! ООП без наследования, это не ООП, это просто немного другой стиль оформления кода в логические модули.
Делайте базовый класс, выносите в него весь общий функционал. Table1 и Table2 должны отличаться принципиально, они должны описывать разные типы сущностей и в их реализации должны остаться атрибуты и методы реализующие эту неодинаковость.



Отредактировано FishHook (Июль 31, 2015 15:34:39)

Офлайн

#3 Июль 31, 2015 15:44:18

Stright
От: Кострома
Зарегистрирован: 2015-01-20
Сообщения: 139
Репутация: +  16  -
Профиль   Отправить e-mail  

Вопрос по ООП

Извиняюсь, что плохо описал классы Table, общего в этих двух классах будет - только метод read(). process() и write() будут разные во все таблицах. Из-за одного метода создавать общий класс Table и в классах Table1 и Table2 описывать только 2 отличающихся метода?

Отредактировано Stright (Июль 31, 2015 15:45:40)

Офлайн

#4 Июль 31, 2015 16:12:04

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Вопрос по ООП

Stright
Из-за одного метода создавать общий класс Table и в классах Table1 и Table2 описывать только 2 отличающихся метода?
Это вы на джаве не писали, видимо.
Stright
process() и write() будут разные во все таблицах

покажите пример реализации write в двух разных таблицах



Офлайн

#5 Июль 31, 2015 16:47:06

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2849
Репутация: +  186  -
Профиль   Отправить e-mail  

Вопрос по ООП

> класс Project, который при создании экземпляра создает список классов из модуля tables
Он у тебя этот список каждый раз при создании объекта создавать будет. Лучше сделай его атрибутом класса.

> table for table in tables.__dict__
Если у тебя в табличном модуле кроме таблиц ещё что-то будет, то оно тоже в self.lst_tables и self.tables уйдёт.
Сделай базовый класс для таблиц и при загрузки проверяй на него через issubclass.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Июль 31, 2015 16:48:55)

Офлайн

#6 Июль 31, 2015 23:29:57

Stright
От: Кострома
Зарегистрирован: 2015-01-20
Сообщения: 139
Репутация: +  16  -
Профиль   Отправить e-mail  

Вопрос по ООП

FishHook
Это вы на джаве не писали, видимо.
ни на чем больше не писал, и образование и работа с программированием вообще никак не связаны

FishHook
покажите пример реализации write в двух разных таблицах
Таблица 1
Что получается
Таблица 2
Что получается
Одна табличка простая, вторая - посложнее, число строк, после которых будет объединение ячеек, неизвестно, вычисляется в процессе работы функции, в каких-то таблицах проекта будут объединены столбцы и строки одновременно, соответственно и данные будут записываться по-разному.

Офлайн

#7 Авг. 1, 2015 09:34:42

MiK
Зарегистрирован: 2014-10-30
Сообщения: 191
Репутация: +  -1  -
Профиль   Отправить e-mail  

Вопрос по ООП

FishHook
Чем эти две класса у вас отличаются? А ничем! ООП без наследования, это не ООП, это просто немного другой стиль оформления кода в логические модули.

Ты даёшь
ООП - это по сути и есть немного другой стиль структурирования кода в логические модули.

К тому же не все языки поддерживают наследование, оттого, что в огромных проектах, множественное наследование порождает множество ошибок. Вообщем, есть и другие принципы, кроме как наследоваться.
Хотя я уверен, что ты это всё и сам знаешь - просто сморозил, бывает.

Офлайн

#8 Авг. 1, 2015 10:21:05

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Вопрос по ООП

MiK, не умничай, у тебя не получается
>>>К тому же не все языки поддерживают наследование
Ты знаешь объектно-ориентированные языки программирования без наследования? Примеры в студию!
>>>множественное наследование порождает множество ошибок
покажи пальцем, где я говорил про множественное наследование
>>>Вообщем, есть и другие принципы, кроме как наследоваться.
Посмотри в любой профессиональный проект на питоне. Например в код джанги или sqlalchemy и покажи мне любой вменяемый проект построенный на “других принципах”.
>>>ООП - это по сути и есть немного другой стиль структурирования кода в логические модули.
ООП - это парадигма программирования.

Паради́гма программи́рования — это совокупность идей и понятий, определяющих стиль написания компьютерных программ (подход к программированию). Это способ концептуализации, определяющий организацию вычислений и структурирование работы, выполняемой компьютером.



Отредактировано FishHook (Авг. 1, 2015 10:22:22)

Офлайн

#9 Авг. 1, 2015 12:02:12

MiK
Зарегистрирован: 2014-10-30
Сообщения: 191
Репутация: +  -1  -
Профиль   Отправить e-mail  

Вопрос по ООП

Та я не буду холиварить.

Офлайн

#10 Авг. 1, 2015 12:33:22

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Вопрос по ООП

FishHook
где я говорил про множественное наследование
Так тоже неполохая штука множественное наследование. Уж точно логичнее чем наследование и интерфейсы. :)
MiK
Та я не буду холиварить.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version