Привет.

Есть тулза, писал её сначала в виде просто набора сриптов с функциями. Потом она начала разростаться, начал внеднять классы.

Сейчас решил переписать её с нуля, а заодно - немного глубже вникнуть в ООП, всякие композиии, наследование, и вообще - понять как составлять общую схему отношения классов.

Заранее извиняюсь за терминологию :-)

Заодно - немного попробовал разобраться в UML, получилась вот такая картинка:



Мысль такая:

  • класс RDSmanager - основной класс (“первого уровня”), цель - шарить несколько атрибутов всем дочерним классам;
  • класс Options - первый рабочий класс (“второго” уровня), который начинает обработку - парсит argpase() и в зависимости от опций - создаёт объект из нужного класса “третьего” уровня и вызывает нужный метод (Refresh.refresh() в данном примере);
  • класс Refresh - “третьего” уровня, который занимается уже непосредтсвенно обработкой данных, операции с файлами и прочее, используя некоторые общие методы из класса UnityServices;
  • UnityServices класс - просто “хранилище” для вспомогательных методов, которые будут использоваться Refresh и другими классами “третьего” уровня.

И сами классы, кратко:

RDSmanager.py:

...
from lib.local.rds_services import Logger
from lib.local.exceptions import *
class RDSmanager(object):
    clc_user = 'user'
    clc_password = 'password'
    rdsmanager_localpath = os.path.dirname(os.path.abspath(__file__))
    logger = Logger(rdsmanager_localpath)
    if os.environ.get('bamboo_working_directory'):
        local_source_dir = os.environ['bamboo_working_directory']
    elif os.environ.get('RDS_HOME'):
        local_source_dir = os.environ['RDS_HOME']
    else:
        raise NoSourceDirVariableError(logger, 'Directory with project source files not found. Exit.')
...
...
class Options(RDSmanager):
    ...
    def getopts(self):
        ...
        parser = argparse.ArgumentParser()
        subparsers = parser.add_subparsers()
        # Unity options
        parser_unity = subparsers.add_parser('unity', help='Unity application options')
        parser_unity.set_defaults(func=self.handler_unity)
        parser_unity.add_argument('-r',
                                  '--refresh',
                                  action='store_true',
                                  dest='unity_refresh',
                                  help='Copy necessarry DLLs to Copy necessarry DLLs '
                                       'to MainApplication\\Assets\\PreparedPlugins and '
                                       'NGUIProject\\Assets\\PreparedPlugins before build.')
...
       def handler_unity(self, options_list):
            """Select and run specified command line options"""
            if options_list.unity_refresh:
                self.logger.logger.info('Running Unity refresh modules before Application build')
                from lib.unity.refresh import Refresh
                unity = Refresh()
                unity.refresh()
...

lib.unity.refresh.py:

...
from RDSmanager import RDSmanager
from lib.unity.unity_services import UnityServices
class Refresh(RDSmanager):
    def refresh(self):
        self.logger.logger(self.__class__.__name__)
        unity = UnityServices()
        modules_list = unity.modules_list()
        for modname in modules_list:
        ...
      if moddstdir:
          self.logger.logger.info('Copy file {} to {}'.format(module_src_dll_file, moddstdir))
          shutil.copy(module_src_dll_file, moddstdir)
...

lib.local.unity_services.py:

...
from lib.local.exceptions import *
from RDSmanager import RDSmanager
class UnityServices(RDSmanager):
    ...
    def modules_list(self):
        ...
        return modules_names
    def module_csproj_file(self, module_name):
        ...
                return module_csproj_file
...

Собственно, вопросы:

  • что не правильно в моём UML? (например - мне кажется, что отношения Logger и REDSmanager - это скорее “композия”, верно или нет?);
  • вообще структура наследования и связей - что не верно в моей схеме?
  • немного кода видно, может что-то и там можно было бы улучшить? если надо - добавлю.

Спасибо.