rabotaet#12
Conversation
romvano
left a comment
There was a problem hiding this comment.
Странная логика с Patient.current_row_idx. Есть подозрения, что будет работать неправильно.
Много однотипного кода, который стоило бы параметризовать. Мб стоит переделать некоторую логику условий на противоположные для уменьшения размера кода
| # Проверка номера документа | ||
| def _check_doc_id(self, val, doc_type): # в doc_type будем передавать значение из dict объекта по ключу document_type | ||
| _valid_len = { | ||
| 'Паспорт' : 10, |
There was a problem hiding this comment.
константы лучше хранить в переменных
There was a problem hiding this comment.
Мне кажется, удобнее будет хранить в словаре, потому что константы семантически связаны и нет смысла записывать каждую в отдельную переменную, так будет сложнее поддерживать
| def __get__(self, obj, objtype): | ||
| return obj.__dict__[self.name] # вернем значение атрибута по ключу(названию атрибута) | ||
|
|
||
| def __set__(self, obj, val): |
There was a problem hiding this comment.
в этой функции довольно много повторяющегося кода: лучше как-то параметризовать
| def __init__(self,first_name,last_name, birth_date, phone, document_type, document_id): | ||
| self._info_logger = logging.getLogger('info_logger') | ||
|
|
||
| if not(first_name and last_name and birth_date |
There was a problem hiding this comment.
при том, что все аргументы конструктора - позиционные и обязательные, эта проверка не нужна
There was a problem hiding this comment.
Здесь идет проверка не на пустоту аргумента, а на пустоту строки, листа, None итд
| f'{self.birth_date} {self.phone} {self.document_type} {self.document_id}') | ||
|
|
||
| @classmethod | ||
| def create(cls, first_name, last_name, birth_date, phone, document_type, document_id): |
There was a problem hiding this comment.
поскольку никакие атрибуты класса в этом методе не используются, а также нет планируемого такого же поведения наследников класса, то метод стоит сделать статическим
| with open('patient.csv', 'r', newline='') as f: | ||
| reader = csv.reader(f, delimiter=';') | ||
| rows = [row for row in reader] # список списков с полями пациента | ||
| rows[self._row_idx] = data # элементу списка со всеми пациентами присваются данные конкретного пациента |
There was a problem hiding this comment.
кажется, этот атрибут всегда будет равен количеству сохраненных в текущей сессии объектов
There was a problem hiding this comment.
увидел использование этого атрибута в PatientCollection. предыдущий комментарий - про тот случай, когда Patient при готовом файле создается впервые
There was a problem hiding this comment.
Атрибут self._row_idx хранит в себе индекс строки, в которой записан текущий объект пациента
Атрибут Patient.current_row_idx - указатель на новую строку файла, куда будет записан следующий пациент.
Он принадлежит классу, а значит общий для всех объектов.
При этом подразумевается, что при каждом "запуске программы" (пользовательской сессии) если существует файл, то существует объект PatientCollection,
который смотрит файл и устанавливает необходимые атрибуты у класса пациент.
Это необходимо для отражения изменения у объектов в файле, при повторном вызове метода save.
Если не хранить указатель на строку, то после изменения атрибута пациента и повторного вызова save в файле вместо изменения появится новая запись.
|
|
||
| with open('patient.csv', "a", newline='') as csv_file: | ||
| writer = csv.writer(csv_file, delimiter=';') | ||
| if not Patient.is_header_written: # Пишем заголовок в файл, он должен быть записан всего один раз, поэтому вот так |
There was a problem hiding this comment.
этот атрибут будет работать верно только при единственном запуске программы. Кажется, что, если запустить этот код для уже готового файла в первый раз, то что-то пойдет не так
There was a problem hiding this comment.
Атрибут Patient.is_header_written - флаг показывающий, что записана шапка таблицы.
Он принадлежит классу, а значит общий для всех объектов.
При этом подразумевается, что при каждом "запуске программы" (пользовательской сессии) если существует файл, то существует объект PatientCollection,
который смотрит файл и устанавливает необходимые атрибуты у класса пациент. Если объекта нет, а существуют только
объекты Patient, то заголовок будет записываться на каждой сессии. Если это неправильное поведение, то как обработать
запись заголовка в сессии без, объекта PatientCollection?
| p = Patient(*row) # Распакуем данные пациента из файла для создания объекта | ||
| p._saved = True # Теперь объект сохранен | ||
| p._row_idx = ind # Индекс объекта | ||
| self.patient_list.append(p) # Добавим пациента в список |
There was a problem hiding this comment.
если файл огромный, то плохо всё хранить в оперативе
No description provided.