Как реорганизовать этот код Python, чтобы сделать его совместимым с SOLID?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как реорганизовать этот код Python, чтобы сделать его совместимым с SOLID?

Сообщение 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)


Подробнее здесь: https://stackoverflow.com/questions/793 ... -compliant
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»