РЕДАКТИРОВАТЬ: Когда вы должны и не должны отойти от ООП для скорости / производительности? может иметь отношение к этому вопросу.
Извините, если мой вопрос неясен;Я - любитель-любитель, и, будь я лучше образован, я мог бы знать более подходящий жаргон, чтобы быть более конкретным.Позвольте мне использовать несколько простых примеров кода.
class EmployeeRecords(object):
"""A record of all employees."""
def __init__(self):
super().__init__()
self.employees = []
# The following two attributes are redundant.
self.at_office = {"LAN":[], "DET":[], "KAL":[]}
self.in_thirties = []
def register_employee(self, employee):
"""Register a new employee in the records.
This entire method is redundant.
"""
self.employees.append(employee)
self.at_office[employee.office_code].append(employee)
if 30 <= employee.age < 40:
self.in_thirties.append(employee)
class Employee(object):
"""An employee record featuring relevant information for queries."""
def __init__(self, first_name, last_name, age, office_code):
super().__init__()
self.first_name = first_name
self.last_name = last_name
self.age = age
self.office_code = office_code
# Instantiation and what-not goes here.
...
print([x for x in my_records.employees if 30 <= x.age < 40])
# VS
print(my_records.in_thirties)
Что является более подходящим?Является ли последний метод обычно плохим для экспертов, как SO?
- Подробнее -
Кажется, что в вычислительном отношении было бы эффективнее просто добавлять экземпляры Employee к соответствующимсписки при регистрации в EmployeeRecords.Тем не менее, я недавно изучал SQL (наконец), и кажется, что большая часть его эффективного использования - это «нормализация данных»: удаление избыточных данных из нескольких таблиц, которые в противном случае могли бы быть получены с помощью более глубокого запроса.
Я вижу, как и согласен, что наличие избыточных данных может привести к ошибкам;зачем беспокоиться о том, чтобы все эти избыточные списки обновлялись, когда мои запросы могут извлекать данные из одного списка через сопоставление объектов (или, в случае SQL, таблицы)?В приведенном выше примере понимание списка всегда вернет правильную информацию, но использование my_records.in_thirties
даст неожиданные результаты, если я по глупости добавлю my_records.employees
вместо использования my_records.register_employee
.
Это всего лишь пример, гдес точки зрения управления кодом и производительностью, между этими двумя методами мало различий.На практике, однако, запрос может включать поиск по спискам в списках объектов, атрибутами которых являются списки, которые необходимо запрашивать для других объектов.
Считается ли хорошей практикой избегать избыточных списков для этой цели,или это будет считаться большинством выгодным для повторных очень глубоких поисков?Я понимаю, что Python - это не SQL, но я думаю, что ООП в значительной степени относится к отношениям между объектами посредством использования атрибутов, и поэтому я могу видеть, как эти типы списков будут считаться плохой формой и подвержены ошибкам.
Спасибо за вашу помощь.У меня нет формального образования, и, хотя у меня есть многолетний опыт программирования с любимыми проектами, я всегда учусь новым вещам на пути к эффективной архитектуре.Это мой первый пост на SO после многих лет его просмотра, поэтому, пожалуйста, будьте осторожны, если это глупый или неуместный вопрос.Я не знаю, куда еще обратиться!
- Дэвид Эрнандес