Являются ли статические классы правильным способом? - PullRequest
4 голосов
/ 23 декабря 2010

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

В моей программе есть много классов и методов, которые я использую в качестве универсальных инструментов. Например, у меня есть класс для записи в Excel, класс для чтения / записи файлов, класс, который обрабатывает строки различными способами, класс для отображения диалогов / сообщений в моем формате по умолчанию, класс для конкретных математических функций (например, Математика) и др.

Я не могу представить эти классы как настоящие вещи (как и предполагалось для классов / объектов), но они приходят мне в голову как наборы инструментов. Вот почему я делаю их статичными. Таким образом я пишу, например,

excelWriter.create("C:\temp.xls");
excelWriter.append("mydata1\tmydata2\nmydata3\tmydata4");
excelWriter.close();

вместо

ExcelWriter myExcelWriter;
myExcelWriter.create("C:\temp.xls");
myExcelWriter.append("mydata1\tmydata2\nmydata3\tmydata4");
myExcelWriter.close();

Это подходит мне больше по той причине, что я считаю набор инструментов чем-то, что всегда для меня, и мне не нужно создавать объект каждый раз, когда я хочу его использовать. Разве математика C ++ не такая же, как и статическая? Я обсуждал это со многими моими коллегами и друзьями-программистами, и большинство из них говорят, что я должен создать объект, потому что именно в этом и заключается объектно-ориентированное программирование.

Я понимаю, что они сказали в другом контексте: В свободное время я занимаюсь разработкой карточной игры с использованием VB.net. Там у меня были занятия по игре, игроку, колоде, руке. Объекты, которые я сделал, есть много в каждом классе, потому что у меня много игр, игроков, колод, рук. И их можно представить как реальные вещи. Это особенно сильно отличается, когда вы разрабатываете игру. Разработка игры гораздо более объектно-ориентирована, поскольку содержит реальные вещи .

Мне было интересно, я как-то здесь ужасно не прав? Я хотел бы услышать мнения о том, что такое oop - все о глубине. Я также хотел бы услышать, для чего предназначены статические классы.

Спасибо

Ответы [ 3 ]

2 голосов
/ 23 декабря 2010

Нет, класс, содержащий только статические функции-члены, не будет правильным в этом случае, по крайней мере, на мой взгляд. Второй класс ExcelWriter был бы лучше. В любом случае, где вы храните дескриптор файла для вывода в Excel? Надеюсь, не в статической переменной? Это основной кандидат на член данных для этого класса.

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

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

2 голосов
/ 24 декабря 2010

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

ООП дизайн очень прост, когда вы думаете о том, что вы делаете и используете буквально. Например, в вашем случае вы использовали слово «myExcelWriter», которое является писателем Excel. Так что, если это что-то, это объект. Это означает, что ему нужен экземпляр.

Всегда просто опишите, что вы делаете с собой, если то, что вы делаете, может быть описано существительным, то это объект. Если это прилагательное, это атрибут или член класса. Если это глагол, то это метод. Если это наречие, то это атрибут или переменная, переданная функции.

Статические классы - это инструменты, которые содержат независимые функции и просто выполняют некоторые вычисления с входными переменными. (Снова как Math, это просто вычисляет 2 числа)

Статические функции в классах - это инструменты, которые используются в объектах этого класса, для работы которых не требуется состояние экземпляра. (Вроде Int.Parse())

ООП гораздо ближе к реальному языку IMO, поэтому программировать таким способом интуитивно понятнее.

1 голос
/ 23 декабря 2010

Классы не имеют , чтобы представлять реальную вещь. Если их использование облегчает понимание вашей программы, вы делаете это правильно.

Тем не менее, класс должен иметь как данные, так и методы. Ваши классы Excel и File кажутся мне хорошими, но будьте осторожны с классом, в котором есть только методы и данные.

...