Есть тулза, писал её сначала в виде просто набора сриптов с функциями. Потом она начала разростаться, начал внеднять классы.
Сейчас решил переписать её с нуля, а заодно - немного глубже вникнуть в ООП, всякие композиии, наследование, и вообще - понять как составлять общую схему отношения классов.
Заранее извиняюсь за терминологию :-)
Заодно - немного попробовал разобраться в UML, получилась вот такая картинка:
![](http://rtfm.co.ua/uploads/rds_ng-0.2.png)
Мысль такая:
- класс 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 - это скорее “композия”, верно или нет?);
- вообще структура наследования и связей - что не верно в моей схеме?
- немного кода видно, может что-то и там можно было бы улучшить? если надо - добавлю.
Спасибо.