2010-06-13 8 views
5

Użytkownicy Stackoverflow: Wiele rzeczy może być reprezentowanych w programach przy użyciu podstawowych typów, lub możemy stworzyć dla nich nową klasę.Kiedy używać podstawowych typów (Integer, String) i kiedy pisać nową klasę?

Przykład: Numer ubezpieczenia społecznego może być numerem, łańcuchem lub jego własnym obiektem.

(Inne częste przykłady: numery telefonów, nazwiska, kody pocztowe, identyfikator użytkownika, identyfikator zamówienia i inne identyfikatory.)

Moje pytanie brzmi: Kiedy należy stosować podstawowe rodzaje, a kiedy powinniśmy napisać sami się nowa klasa?

Widzę, że gdy zachodzi potrzeba dodania zachowania, należy utworzyć klasę (przykład: analiza składni, sprawdzanie poprawności, formatowanie itp.). Ale czy to jedyne kryterium?

Natknąłem się na przypadki, w których wiele z tych rzeczy jest reprezentowanych jako liczby całkowite java i/lub ciągi znaków. Utraciliśmy korzyści z sprawdzania typów i często widziałem błędy spowodowane parametrami miksowanymi w wywołaniach function(Intever, Integer, Integer, Integer).

Czy nie moglibyśmy czerpać korzyści z posiadania sprawdzenia typu, nawet jeśli żaden z nich nie uzasadnia posiadania własnej klasy?

Oczywiście odpowiedź brzmi "to zależy". Ale co myślisz i co zwykle robisz?

+1

Oto pytanie dotyczące pomysłów dotyczących * sposobu * zastąpienia elementów pierwotnych klasami, jeśli/kiedy zdecydujesz, że chcesz: http://stackoverflow.com/questions/24981278/design-patterns-for-type-safe-integers – Morad

Odpowiedz

2

Pytanie, które należy zadać, nie brzmi "Jak mogę przechowywać te dane?", Ale "Jak mogę postępować zgodnie z tymi danymi?".

Aby skorzystać z kilku przykładów: Numer SSN ma postać numeryczną w postaci XXX-XX-XXXX. Jeśli zamierzasz odczytać wartość wprowadzoną przez użytkownika, musisz wprowadzić pewien rodzaj sprawdzania poprawności, aby upewnić się, że format został poprawnie wprowadzony. Możesz również podać sposób wprowadzania 3 liczb pojedynczo (np. 3 pola tekstowe w formularzu), ale łącz je wewnętrznie w SSN. Samo użycie klasy String lub Integer nie zapewni możliwości wykonywania tych zadań, więc dobrze jest podać jej własny typ i upewnić się, że zawsze będą przechowywane tylko prawidłowe wartości. Typ będzie miał wewnętrzną wartość Int lub String, aby faktycznie przechowywać dane, ale klasa enkapsulacji zapewnia, że ​​odczytujesz/zapisujesz wartość w prawidłowy sposób.

Numery telefonów, kody pocztowe to inne obszary, w których możesz chcieć przeprowadzić walidację, więc rozsądnie jest z nich korzystać.

UserIds zależą od scenariusza, ale typ pierwotny byłby zwykle wystarczający. Jeśli jednak chcesz ograniczyć identyfikatory użytkowników do pewnego zakresu liczbowego (różniącego się od zakresu dowolnego typu typu Integer), możesz zawrzeć je w klasie.

2

Jeśli dla tego obiektu rzeczywistego istnieje wiele typowych właściwości i chcesz mieć szczegółowe metody manipulowania tymi właściwościami, użyj klasy. Jeśli istnieje tylko jeden typ danych i nie ma potrzeby zaawansowanej manipulacji, użyj prymitywu.

1

Tak długo, jak typy wbudowane mają sens dla tego, do czego są używane, nie ma powodu, aby tworzyć specjalną klasę. Kiedy nie jest jasne, co właściwie oznaczają dane w zmiennej, możesz utworzyć klasę, aby było jasne.

Wartość taka jak numer telefonu działa na przykład jako ciąg.Jest to numeryczny charakter, ale nie będziesz przeprowadzał na nim żadnych obliczeń, więc każda walidacja, którą robisz, nie jest krytyczna dla funkcji, to tylko powstrzymywanie użytkowników przed wprowadzaniem nonsensów.

Wartość taka jak odległość jest kandydatem na klasę. Możesz użyć liczby całkowitej lub podwójnej do zapisania odległości, ale musisz dodać trochę więcej informacji, aby wartość była sensowna, na przykład nazwać zmienną DistanceInMeters. Można utworzyć klasę dla odległości, aby ograniczyć jej użycie, dostarczając jedynie metodę FromMeters jako konstruktor i tylko właściwość Liczniki do odczytywania wartości. W ten sposób jest jasne, co oznacza ta wartość.

+0

W jakiś sposób twoje przykłady wydają się być dokładnym przeciwieństwem mojej intuicji, numer telefonu powinien być klasą, ponieważ może występować w wielu różnych formatach i nie chcemy, aby każdy musiał obsługiwać przetwarzanie i sprawdzanie go, z drugiej strony ręcznie, jeśli chodzi o zmienne, takie jak odległość Nie widzę potrzeby, aby zrobić z niego swoją własną klasę, zwykle odnotowuję jednostki w nazwie zmiennej (np. 'int commandTimeoutSec') – Morad

+0

@MoradAbdelrahman: Tak, to może być jak chcesz go zaimplementować, ale nie ma to znaczenia dla przykładów. Są to tylko przykłady, na których można się odnieść, a to jest uzasadnienie w przykładach. – Guffa

1

To kompromis. Podstawowe typy są łatwe do zrozumienia, natomiast typy niestandardowe należy rozumieć jako pierwsze. Powinien to być jeden z głównych elementów twojej domeny projektu, który ma być zadeklarowany jako typ niestandardowy.

Kryteria: jeśli warta jest niestandardowego typu, istnieje już dla niego odpowiednik dla danej domeny. Na przykład nazywamy "kierowcę samochodu" "kierowcą" w dziedzinie transportu, podczas gdy są pasażerowie i ... podczas gdy w sferze medycyny wszyscy kierowcy i pasażerowie są ludźmi, a kryteria to coś innego.

0

Jeśli to pole jest zawsze używane w połączeniu z innymi polami, logiczne grupowanie ma sens. Można to zauważyć, gdy istnieją metody, które konsekwentnie przyjmują ten sam zestaw parametrów.

Grupowanie pól w jednostki logiczne powoduje abstrakcję samej jednostki logicznej od użytkowników jednostki logicznej. Oznacza to, że szczegóły implementacji są ukryte, co umożliwia zmianę reprezentacji danych bez wpływu na inne obszary kodu.

Jeśli funkcjonalność działa wyłącznie na tym polu, uważam ją za kandydata na klasę. Ponadto, jeśli urządzenie jest proste, ale zawsze jest używane w ten sam sposób, rozważę wprowadzenie go w klasę i umieszczenie tej funkcjonalności w klasie. Oznacza to, że funkcjonalność jest utrzymywana tylko w jednym miejscu, więc zmiana tego zachowania jest łatwiejsza, a Twój kod będzie zawierał mniej powtórzeń.

1

Zapewnienie bezpieczeństwa typowego dla funkcji wielu argumentów jest przypadkiem, w którym IMO rzeczywiście warto byłoby stworzyć klasę, która nie ma żadnej funkcjonalności (zakładając, że masz wystarczająco dużo funkcji w kodzie, aby skorzystać).

Argumenty o nazwie byłyby łatwiejsze, choć niestety nie są dostępne we wszystkich językach.

+0

Minęło trochę czasu, odkąd zadałem to pytanie, ale doszedłem do tego samego wniosku. Typ bezpieczeństwa i unikanie zamieszania jest często wart wprowadzenia nowych (maleńkich) klas. – andrel

Powiązane problemy