Подарки от программис'тов
В чём прикол делать приватный словарь, а потом публичные методы доступа к нему 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 просто переписывает логику индекса словаря. А ещё это же и в интерфейсе сделано. А к нему - тесты. И тесты тупо тестируют дефолтный словарь.
Остаётся вариант со скрытием имплементации. Но здесь явно пахнет преждевременными оптимизациями. Я думаю, остаётся "программист не знал" как самый вероятный вариант.