Магические числа - чтение из файла конфигурации так же, как глобальное пространство? Плохо для юнит-тестирования? - PullRequest
0 голосов
/ 15 мая 2009

Рассмотрим следующий класс:

class Something : ISomething {

    public void DoesSomething(int x) {
        if (x == 0) {
            x = 1;
        }
    }
}

Я хочу, конечно, удалить магическое число - мои модульные тесты проходят успешно и т. Д., Но я хочу изменить этот ужасный магический номер.

Я использую C #, но я думаю, что эта проблема довольно общая. Чтение из конфигурационного файла (xml-файл) выполняется следующим образом:

ConfigurationManager.AppSettings["MyOldMagicNumber"]...

Что, конечно, было бы проверкой. Я мог бы легко сделать частную функцию в этом классе, которая помечена как виртуальная. Его цель инкапсулировать этот код выше. Это позволило бы мне получить доступ к моим модульным тестам, чтобы переопределить и подключить мое собственное значение.

Мой вопрос -

Это плохо, что я делаю? Смотрите заголовок.

Edit:

Это для игры - поэтому, скорее всего, во время разработки значения будут часто меняться, и повторная сборка будет рутиной. Я должен был упомянуть, что приведенный выше код является общим, я сделал его таким, чтобы вопрос был как можно более простым. Немного контекста, хотя - что «0» - это границы игровой зоны.

Заранее спасибо.

Ответы [ 3 ]

5 голосов
/ 15 мая 2009

Почему бы вам не создать интерфейс для этого, как

public interface IApplicationSettings {
 int MyOldMagicNumber { get; }
}

Тогда есть две реализации этого: одна для производства, которая читает из файла конфигурации, и одна фальшивка для юнит-тестов.

public class ApplicationSettings : IApplicationSettings {
 public int MyOldMagicNumber { 
   get { return ConfigurationManager.AppSettings["MyOldMagicNumber"]; }
  }
}

public class FakeApplicationSettings : IApplicationSettings {
 public int MyOldMagicNumber { 
   get { return 87; /*Or whatever you want :) */ }
  }
}
1 голос
/ 15 мая 2009

Я бы определенно поместил его в файл конфигурации, если вы играете в игру. Это потому, что вы можете (захотите) попробовать другой набор значений. Помещение его в файл конфигурации означает, что вы можете поменять файлы и попробовать новые числа без изменения «движка». Вы можете даже определить свойства / значения каждого игрового существа в конфигурации, и это нормально!

1 голос
/ 15 мая 2009

Вам действительно нужно изменить эти значения без перекомпиляции программы? Если нет, я думаю, что вам следует избегать помещения его в ваш конфигурационный файл, иначе вы в конечном итоге будете программировать на xml;)

Использование констант хорошо для читабельности в этом случае:

class Something : ISomething {

    public const int Zero = 0;
    public const int One = 1;

    public void DoesSomething(int x) {
        if (x == Zero) {
            x = One;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...