Потратив несколько часов на исследование, я изо всех сил пытаюсь написать код, соответствующий принципам SOLID.
Мне нужно создать приложение для взаимодействия с API OpenMetadata (в частности, для загрузить данные YAML). Однако я столкнулся с некоторыми внутренними связями между сущностями OpenMetadata, которые я не могу отделить для создания модульного кода.
Как видите, TableCreator зависит от других создателей ( например: ColumnCreator, DatabaseSchemaCreator), а также требует, чтобы клиент метаданных выполнял поиск сущностей, необходимых для построения запроса.
Не могли бы вы помочь мне провести рефакторинг кода для улучшения его дизайн?
Спасибо
class GenericEntityCreator(ABC):
def __init__(self, entity_handler: Optional['EntityHandler']=None):
self._entity_handler = entity_handler
@abstractmethod
def create_entity(self, data: Any) -> T:
pass
class EntityHandler:
def __init__(self, metadata_client: OpenMetadataClient):
self.metadata_client = metadata_client
self._creators: Dict[Type, GenericEntityCreator] = {}
self._initialize_creators()
def _initialize_creators(self) -> None:
self._creators.update({
Table: TableCreator(self),
Column: ColumnCreator(self),
DatabaseSchema: DatabaseSchemaCreator(self),
})
def get_creator(self, entity_type: Type[T]) -> GenericEntityCreator:
creator = self._creators.get(entity_type)
if not creator:
raise ValueError(f"No creator registered for entity type {entity_type}")
return creator
class TableCreator(GenericEntityCreator):
def get_search_string(self, data: TableData) -> str:
return (f"{data.origin.capitalize()}."
f"{data.platforms[data.origin].database}."
f"{data.platforms[data.origin].databaseSchema}."
f"{data.name.root}")
def create_entity(self, data: TableData) -> CreateTableRequest:
column_creator = self._entity_handler.get_creator(Column)
columns = [column_creator.create_entity(col) for col in data.columns]
db_schema_creator = self._entity_handler.get_creator(DatabaseSchema)
search_string = db_schema_creator.get_search_string(data)
database_schema = self._entity_handler.metadata_client.get_entity_from_es(entity_type=DatabaseSchema, fqn_search_string=search_string)
return CreateTableRequest(
name=EntityName(root=data.name.root),
description=data.description,
tableType=TableType("Regular"),
databaseSchema=FullyQualifiedEntityName(root=database_schema.fullyQualifiedName.root),
columns=columns
)
--main.py
entity_handler = EntityHandler(omd_client)
table_creator = entity_handler.get_creator(Table)
table_creator.create_entity(data)
Подробнее здесь: https://stackoverflow.com/questions/793 ... -compliant
Как реорганизовать этот код Python, чтобы сделать его совместимым с SOLID? ⇐ Python
Программы на Python
1736386074
Anonymous
Потратив несколько часов на исследование, я изо всех сил пытаюсь написать код, соответствующий принципам SOLID.
Мне нужно создать приложение для взаимодействия с API OpenMetadata (в частности, для загрузить данные YAML). Однако я столкнулся с некоторыми внутренними связями между сущностями OpenMetadata, которые я не могу отделить для создания модульного кода.
Как видите, TableCreator зависит от других создателей ( например: ColumnCreator, DatabaseSchemaCreator), а также требует, чтобы клиент метаданных выполнял поиск сущностей, необходимых для построения запроса.
Не могли бы вы помочь мне провести рефакторинг кода для улучшения его дизайн?
Спасибо
class GenericEntityCreator(ABC):
def __init__(self, entity_handler: Optional['EntityHandler']=None):
self._entity_handler = entity_handler
@abstractmethod
def create_entity(self, data: Any) -> T:
pass
class EntityHandler:
def __init__(self, metadata_client: OpenMetadataClient):
self.metadata_client = metadata_client
self._creators: Dict[Type, GenericEntityCreator] = {}
self._initialize_creators()
def _initialize_creators(self) -> None:
self._creators.update({
Table: TableCreator(self),
Column: ColumnCreator(self),
DatabaseSchema: DatabaseSchemaCreator(self),
})
def get_creator(self, entity_type: Type[T]) -> GenericEntityCreator:
creator = self._creators.get(entity_type)
if not creator:
raise ValueError(f"No creator registered for entity type {entity_type}")
return creator
class TableCreator(GenericEntityCreator):
def get_search_string(self, data: TableData) -> str:
return (f"{data.origin.capitalize()}."
f"{data.platforms[data.origin].database}."
f"{data.platforms[data.origin].databaseSchema}."
f"{data.name.root}")
def create_entity(self, data: TableData) -> CreateTableRequest:
column_creator = self._entity_handler.get_creator(Column)
columns = [column_creator.create_entity(col) for col in data.columns]
db_schema_creator = self._entity_handler.get_creator(DatabaseSchema)
search_string = db_schema_creator.get_search_string(data)
database_schema = self._entity_handler.metadata_client.get_entity_from_es(entity_type=DatabaseSchema, fqn_search_string=search_string)
return CreateTableRequest(
name=EntityName(root=data.name.root),
description=data.description,
tableType=TableType("Regular"),
databaseSchema=FullyQualifiedEntityName(root=database_schema.fullyQualifiedName.root),
columns=columns
)
--main.py
entity_handler = EntityHandler(omd_client)
table_creator = entity_handler.get_creator(Table)
table_creator.create_entity(data)
Подробнее здесь: [url]https://stackoverflow.com/questions/79341131/how-to-refactor-this-python-code-to-make-it-solid-compliant[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия