2010-07-22 10 views
41

Zwykle podczas tworzenia oprogramowania potrzebne są różne funkcje użytkowe. Jak skompresowanego pliku, plik zip ekstraktu, uruchomienie przeglądarki internetowej, dostać skalowany obraz ...Czy dobrze jest mieć klasę "Utils" w swoim projekcie oprogramowania?

Co zrobiłem jest, jak umieścić wszystkie funkcje tego narzędzia jako funkcja statycznego w obrębie jednej klasy o nazwie „Utils”

https://github.com/yccheok/jstock/blob/master/src/org/yccheok/jstock/gui/Utils.java

Czy to dobra praktyka? Czy rzeczy staną się niemożliwe do opanowania, gdy liczba funkcji będzie większa i większa?

+14

Myślę, że kończy się to całkiem normą. Chciałbym jednak bardziej konkretnie to sprecyzować. 'FileUtils' i' ImageUtils', etc ... – Mike

+0

Tak, staram się robić takie rzeczy. Jeśli robi się duży, kategoryzuję je tak, jak wspomniał Mike. –

+1

Dla mnie nie ma różnicy w oprogramowaniu dla funkcji "użytkowych" i innych części projektu. Tworzę struktury klasowe potrzebne do rozwiązania problemu, i to nie jest różne dla funkcji specyficznych dla projektu lub bardziej ogólnych funkcji. – Kwebble

Odpowiedz

32

To absolutnie najlepsza praktyka! nie chcesz mieszać wszystkich tych funkcji narzędziowych z resztą logiki biznesowej aplikacji. Jednak w miarę wzrostu plików utils i/lub klas, zaleca się grupowanie ich według funkcji, którą zapewniają.

Na przykład w aplikacji internetowej można znaleźć taką strukturę pakietów.

org.sample.web.model 
org.sample.web.utils 
org.sample.web.validators 
org.sample.web.validators.utils 
+0

Yup. Obecnie mam kilka klas o nazwie Utils, ale w innym pakiecie. –

0

Zgadzam się z komentarzem Mike'a. Używam C#, ale podobną implementację. Mam projekt util, który utrzymuję potajemnie, a następnie upuszczam bibliotekę DLL w nowym projekcie. W ten sposób, gdy pojawiają się błędy/zmiany, mogę aktualizować projekty, po prostu zastępując bibliotekę DLL.

Prowadzę osobną klasę dla różnych obszarów aplikacji, jak sugerował Mike w swoim komentarzu.

18

Tak, klasy narzędziowe są dobrym pomysłem, ale jak ze wszystkimi programowania obiektowego, powinno być dążenie do maksymalnej spójności, minimalne sprzęgła.

Maksymalna spójność oznacza, że ​​wszystko w jednej klasie powinno być ze sobą mocno powiązane . Minimalne połączenie oznacza, że ​​nie powinno być niepotrzebnych zależności między klasami między klasami.

Innymi słowy, łączenie kompresji z manipulacją obrazem lub uruchamianiem zewnętrznych procesów w jednej klasie jest złym pomysłem. Wszystkie klasy mają klasę kompresji i klasę narzędzi do manipulacji obrazami, ale nie łączą się ze sobą.

Takie postępowanie jest podobne do używania wzoru singleton jako obiektu bożego, getta, w którym po prostu wyrzucasz wszystkie śmieci, które powinny być lepiej zorganizowane. Powiedziałbym, że można używać klasy uber-utility podczas programowania, ale upewnij się, że kod jest lepiej zorganizowany przed wysyłką. Obsługa będzie o wiele łatwiejsza.

Czy to dobra praktyka?

Nie, nie na dłuższą metę, chociaż jest to przydatne, gdy jest wykonywane tymczasowo.

Czy sytuacja stanie się trudna do opanowania, gdy liczba funkcji będzie większa i większa?

Tak, nie ma co do tego pytania.

0

Bardzo przydatna jest klasa użytkowa (lub pakiet zajęć). Generalnie mam tendencję do dzielenia moich zadań według funkcjonalności na klasy, więc mogę mieć FileUtils, DatabaseUtils itp.

Zdecydowanie sugerowałbym jednak utrzymanie twoich narzędzi w oddzielnym słoiku lub projekcie (bardzo łatwe w Eclipse). Jeśli masz wiele projektów korzystających z tych samych narzędzi, dobrym pomysłem jest uniknięcie replikacji kodu. Posiadanie projektu lub słoika do dodania jest bezcenne.

0

Moja praktyka polega na posiadaniu zarówno klauzul *Utils jak i klas *Helper. Pierwsza zawiera funkcje statyczne wielokrotnego użytku (w przypadku Javy i PHP), które nie są związane z aplikacją, gdzie te ostatnie są logikami aplikacji/domen wielokrotnego użytku - metodami niestatycznymi i zwykle z zależnościami od innych usług/komponentów/menedżerów.

Oto kilka zasad, które obowiązują zanim ja tworzę metodę lub klasę *Utils:

  1. Czy sam język już ją wspierać?
  2. Czy Apache Commons ją obsługuje? (lub kilka innych popularnych bibliotek - ponieważ ktoś mógł napisać coś, co robi to lepiej niż Ty).
  3. Jak mogę go użyć do ponownego użycia (neutralny projekt/aplikacja), aby moje inne projekty mogły z niego korzystać?
  4. Jak mam to nazwać? (Tak, zawsze będą one podzielone na kategorie i oddzielone, ponieważ te klasy ostatecznie się rozwiną i możesz stracić nad nimi kontrolę, gdy więcej programistów doda do niego więcej metod.)
+1

Argh ... U są również z Malezji. Wydaje mi się, że widziałem cię przed aktywnym działaniem w MYJUG. ale ta grupa wydaje się mało członkami społeczności: p –

0

Klasy użytkowe zwykle mają tendencję do tworzenia kodu stylu postępowania. Wbrew czystym konwencjom OO. Upraszczają one jednak twoje życie, więc wykorzystaj je. Ale niech każdy zrobi to samo, inaczej skończysz z klasą Boga, która stanie się chwytem wszystkich metod, które nie wydają się pasować do przedmiotu, na którym powinny się znajdować.

2

Czy to dobra praktyka?

W większości przypadków używam w ten sposób.

Podobnie jak w przypadku programowania obiektowego, należy dążyć do maksymalnej spójności i minimalnego sprzężenia.

Nie zabijaj produktywności przez ściśle według tych zasad, można zobaczyć wiele wspaniałych ram tam je łamać.

5

Nie, nie uważam, że zajęcia użyteczności publicznej są dobrą praktyką. Psycologicznie słowo "Narzędzia" jest po prostu zbyt szerokie i nawet jeśli podzielisz je na wiele klas * Util stanie się po prostu wysypiskiem dla rzeczy, które są "zbyt trudne", aby pasowały do ​​odpowiedniego projektu klasowego.

Na przykład weź pseudo-fikcyjną klasę StringUtils. Możesz mieć setki metod kodowania/dekodowania dla różnych schematów, transformacji przypadku, obsługi białych znaków itp. Lepszym podejściem, jak sądzę, jest użycie wzorca strategii do obsługi tych przekształceń, które potencjalnie mogłyby nawet pozwolić na możliwość klienta kod wprowadzający nowe przekształcenia bez potrzeby edycji/rekompilacji oryginalnego kodu. Otrzymasz mocniejszy, bardziej elastyczny i łatwiejszy do utrzymania system.

3

Jeśli jest to co najmniej statyczne, to ma sens w klasie Util. To łatwe! Spójność i sprzężenie mają sprawić, że twoje życie stanie się łatwiejsze, niż byłoby to możliwe, więc sugerowałbym, żebyś trzymał się po swojemu.

2

W rzeczywistości pojęcie klas Utils i Helper pochodzi z niemożności napisania wolnych funkcji w środowiskach, w których każda funkcja musi należeć do klasy (z powodu ograniczeń językowych lub projektu). Klasa Utils bez funkcji statycznych kończy się na roli pakietu z darmowymi funkcjami.

Ponieważ jest to powtarzające się zjawisko w wielu projektach oprogramowania, uważam, że jest to trochę idiomem dla projektów OOP, a zatem Dobrą Praktyką, ponieważ ludzie odnoszą się do niego. Jak podkreślają inne odpowiedzi, korzystnym ulepszeniem byłoby zakodowanie twoich klas Utils do osobnego projektu, aby ułatwić ponowne użycie i konserwację.

+1

Możesz zobaczyć zalety/wady tej praktyki dla języka C++, w której darmowe funkcje są dozwolone w tym powiązanym [pytaniu] [1]. [1]: http://stackoverflow.com/questions/3070805/c-how-to-design-a-utility-class –

Powiązane problemy