русский
Germany.ruForen → Архив Досок→ Programmierung

Подарки от программис'тов

26.07.22 15:05
Re: Подарки от программис'тов
 
alex445 коренной житель
in Antwort Программист 26.07.22 14:20, Zuletzt geändert 26.07.22 15:12 (alex445)
В чём прикол делать приватный словарь, а потом публичные методы доступа к нему GetValue и SetValue, которые просто достают данные из словаря и помещают их в него?
Тут может быть 3 варианта:
1) написавший это пришел из C++ и на момент написания еще не перестроился :)
2) GetValue и SetValue изменяют стандартное поведение словаря. Например GetValue проверяет, есть ли ключ и возвращает null, если ключа нет (стандартное поведение - кинуть исключение KeyNotFoundException) или при SetValue запретить перезаписывание уже имеющегося ключа.
3) Скрыть используемые контейнер. Например для того, чтобы можно было легко заменить контейнер без изменения внешнего интерфейса.

Щас глянул - при добавлении значения SetValue проверяет, есть ли уже такой ключ, и если да, то меняет значение по ключу. Если нет - добавляет новый ключ и значение через метод Add словаря. Стандартный словарь кидает исключение, если ключ уже есть. Однако, точно такого же поведения можно добиться, просто используя индекс - он тоже добавляет ключ и значение, если ключа нет, и обновляет значение, если ключ есть. Т.е. программист, похоже, просто не знал о таком свойстве индекса словаря, иначе бы не стал заморачиваться с добавлением значения через метод Add, а не через индекс.


Вот, посмотрел - эта особенность индекса словаря существовала ещё минимум со времён Дотнета 2.0

6 - https://docs.microsoft.com/en-us/dotnet/api/system.collect...

2.0 - https://docs.microsoft.com/en-us/dotnet/api/system.collect...


Метод GetValue же просто берёт значение по индексу, никак это не обрабатывая - т.е. если индекса (ключа) нет, то словарь кидает исключение, а класс-обёртка над словарём с ним ничего не делает.


Т.е. вся портянка GetValue-SetValue просто переписывает логику индекса словаря. А ещё это же и в интерфейсе сделано. А к нему - тесты. И тесты тупо тестируют дефолтный словарь.


Остаётся вариант со скрытием имплементации. Но здесь явно пахнет преждевременными оптимизациями. Я думаю, остаётся "программист не знал" как самый вероятный вариант.

 

Sprung zu