Лоши ли са статичните класове и методи? Глобалните променливи се гледат с недоволство?

Имам приложение, което има връзка с база данни и въпреки че очевидно има обекти, които съответстват на данни в моята база данни, откривам, че всичките ми методи за обработка на данни могат да бъдат статични, тъй като няма реална нужда от екземпляр на обекта, тъй като моите класове просто работят върху данните и изплюйте нещо, няма нужда да съхранявате нищо извън обхвата на метода. Ако мога да направя метод или клас статичен, трябва ли да го направя?

Също така използвам полезен сингълтон клас за общи (единичен екземпляр) „глобални данни“. Искам да имам добър дизайн, но на тези не се гледат ли с недоволство?

Нека ви дам пример за това, което правя. Зареждам някои данни от моята база данни, използвайки статичен метод, за да ги поставя в глобална променлива в моя клас Singleton (списък с потребителски обект)

Така че моят сингълтон клас има нещо подобно

List<MyCustomObject> SomeList

и моят статичен клас има

static void LoadData()
foreach(data in database something or other)
singletonClass.SomeList.Add()

Така че кодът по-горе може да зареди някои записи от базата данни в SomeList, където всеки елемент в SomeList е от тип MyCustomObject, който съдържа единичен запис на информация.

Това добро изпълнение ли е? Така ли бихте го кодирали?

След това в моя презентационен слой бих извикал друг статичен клас от методи, за да получа данни от единичния клас в необходимия формат.

Не се чувства много OOPey. Но наистина не мога да се сетя как да го направя по друг начин, по който го правиш.


person Tom    schedule 31.12.2010    source източник
comment
По отношение на кой език за програмиране питате това?   -  person Phrogz    schedule 31.12.2010
comment
Тук има добра дискусия за singletons/globals: stackoverflow.com/questions/4059077/   -  person Nathan Pitman    schedule 31.12.2010


Отговори (3)


Статиката и сингълтоните са донякъде недоволни. Но само по същия начин като започване на изречение с „но“ — лошо, когато се използва прекомерно, но понякога това е, което работи най-добре.

Във вашия пример защо имате отделни класове, един сингълтон и един статичен? Сингълтън в много отношения е еквивалентен на клас само със статични данни и методи. Ако вече имате сингълтън, бих казал, че трябва да добавите методите за зареждане на данните към него, а не към отделен клас. Клас със статични методи би бил по-подходящ, ако, да речем, имате полезен код, общ за всички ваши съхранени типове данни.

(Също така, не бих се тревожил твърде много за това какво е OOPey и какво не. Прекомерното инженерство в сляпото обслужване на принципите на ООП може да бъде сериозен проблем, говорейки като човек, който е трябвало да премине през кодовата база на Eclipse...)

person Luke Maurer    schedule 31.12.2010

Позволете ми да ви насоча към една отлична статия по тази тема: Singletons са патологични лъжци.

Проблемът е, че необходимостта да извикате вашата LoadData() функция не е очевидна. Сравнете вашата ситуация с описаната в статията и мисля, че ще видите някои паралели.

person Greg Hewgill    schedule 31.12.2010
comment
Добър улов — да, мисля, че това е най-големият проблем с дадения код. - person Luke Maurer; 31.12.2010

Singletons е един, но static е друг много голям.

OOP или не, статичните променливи имат много недостатъци, но малко удобство при кодиране.

  • Не може да се определи точно време за разпределение, продължителност на живота
  • Не може да работи добре в многонишков режим
  • Бъдещ проблем с разширяването на програмата

...

person 9dan    schedule 31.12.2010