2010-09-11 4 views
3

У меня есть статический класс, который я использую для доступа к моим общедоступным свойствам (глобальным для всего приложения) и методам, которые я использую во время запуска приложения. Например, я установил некоторое свойство в статическом классе, и во время выполнения приложения я могу получить значение из свойства.Статический класс против экземпляра класса

Но я могу создать нестатический класс с одноэлементным шаблоном и использовать его таким же образом.

Вопрос: Какой подход в моем случае правильный?

ответ

3

Приведенные ниже пример показывает, что вы можете использовать интерфейсы с одноплодным классом (что невозможно со статическим классом.)

Я предпочитаю эту модель выше большого список статических методов/свойства или несколько статических классов.

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

public sealed class Settings : IUserStettings, IOSettings 
{ 
    static readonly Settings instance = new Settings(); 

    static Settings(){ } 

    Settings(){ } 

    public static Settings Instance 
    { 
     get { return instance; } 
    } 

    //-- interface implementation 

    public string UserName 
    { 
     get { throw new NotImplementedException(); } 
    } 

    // ---etc... 

    public string filename 
    { 
     get { throw new NotImplementedException(); } 
    } 

    //-- interface implementation 
} 


public interface IOSettings 
{ 
    string disk {get;} 
    string path { get; } 
    string filename { get; } 
} 

public interface IUserStettings 
{ 
    string UserName { get; } 
    string Password { get; } 
} 

И это может быть использовано в простой форме, как, как:

IOSettings iosettings = Settings.Instance as IOSettings; 

    if(iosettings!=null){ 
     Filereader.ReadData(IOSettings iosettings); 
    } 

или

IUserSettings usersettings = Settings.Instance as IUserSettings; 

    if(usersettings!=null){ 
     UserManager.Login(IUserSettings usersettings); 
    } 
+0

Но ленивая загрузка, кеширование и сериализация настроек конфигурации из xmlDocument также является хорошей практикой;) –

+0

+ 1 для написания всех шагов thye. – TalentTuner

3

Зависит от того, чего вы пытаетесь достичь.

Я бы пошел на статические классы, чтобы предоставлять служебные функции в вашем приложении, и в основном избегать одиночных игр для этого типа вещей. См. this question для получения информации о том, когда использовать одиночные игры.

Если ваш класс представляет собой какую-либо сущность в системе (пример: пользователь, сообщение в блоге, продукт, студент и т. Д.), Он не должен быть статическим классом, но должен быть создан каждый раз, когда вы логически используете отдельный экземпляр.

0

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

+0

Использование одноэлементного режима, поскольку они хотят, чтобы «статический класс, инициированный с некоторыми значениями», говорил мне, t понимал точку ориентации объекта. Весь смысл статического класса заключается в том, что не должно быть никаких его экземпляров. –

+0

И вот почему статичность, возможно, не OO, а meta OO? –

+0

Да, я лично думаю, что если вы хотите «инициировать статический класс с некоторыми значениями», вы должны либо искать класс экземпляра, либо статические конструкторы (о которых многие люди не знают). –

1

Мои мысли

1- Статические классы используются, когда нет никаких оснований, чтобы иметь экземпляры, как в .NET Framework Math Class.

Математический класс является неродным, чтобы быть статическим, потому что нет веской причины иметь объект этого класса, а затем поддерживать объект.

2- Шаблон Singleton можно путать с концепцией статического класса, но в singleton вы получаете целый объект, созданный в памяти.

поэтому в конечном итоге это зависит от ваших требований.

1

При взгляде на ОО/тестопригодность точка зрения ни является частным хорошим решением. Найдите SO для singleton, чтобы увидеть аргументы. При этом не используйте статические для использования только в том случае, если вам нужно/нужно написать процедурный код, как это делается с помощью Math

Смежные вопросы