Wiele języków podoba C++
, C#
i Java
pozwalają na tworzenie obiektów, które reprezentują typów prostych, jak integer
i float
. Za pomocą interfejsu klasy można przesłonić operatorów i wykonać logikę, np. Sprawdzanie, czy wartość przekracza regułę biznesową równą 100.
Zastanawiam się, czy w niektórych językach można zdefiniować te reguły jako adnotacje lub atrybuty zmiennej / właściwości.
Na przykład C#
możesz napisać:
[Range(0,100)]
public int Price { get; set; }
A może w C++
tobie możesz napisać:
int(0,100) x = 0;
Nigdy nie widziałem czegoś takiego zrobionego, ale biorąc pod uwagę, jak bardzo uzależniliśmy się od sprawdzania poprawności danych przed przechowywaniem. Dziwne, że ta funkcja nie została dodana do języków.
Czy możesz podać przykłady języków, w których jest to możliwe?
java
c#
c++
annotations
attributes
Reactgular
źródło
źródło
data Bool = True | False
i dla tego, co chcesz powiedzieć,data Cents = 0 | 1 | 2 | ...
mieć spójrz na „Algebraiczne typy danych” (które powinny być bardziej właściwie nazywane typami Hindley-Milner, ale ludzie mylą to z wnioskowaniem typu irytująco) en.wikipedia.org/wiki/Algebraic_data_typetype
końcu w Pascalu jest słowo kluczowe. Orientacja obiektowa jest bardziej wzorcem projektowym niż „atomową” właściwością języków programowania.Odpowiedzi:
Pascal miał typy podzakresów, tj. Zmniejszając liczbę liczb pasujących do zmiennej.
Ada ma również pojęcie zakresów: http://en.wikibooks.org/wiki/Ada_Programming/Types/range
Z Wikipedii ....
może również zrobić
I tutaj robi się fajnie
C nie ma ścisłego typu podzakresu, ale istnieją sposoby naśladowania jednego (przynajmniej ograniczone) za pomocą pól bitowych w celu zminimalizowania liczby używanych bitów.
struct {int a : 10;} my_subrange_var;}
. Może to działać jako górna granica dla zmiennej treści (ogólnie powiedziałbym: nie używaj do tego pól bitowych , to tylko dowód na to, że punkt).Wiele rozwiązań dla liczb całkowitych o dowolnej długości w innych językach raczej dzieje się na poziomie biblioteki, tj. C ++ pozwala na rozwiązania oparte na szablonach.
Istnieją języki, które pozwalają monitorować stany zmiennych i łączyć z nimi twierdzenia. Na przykład w Clojurescript
Funkcja
mytest
jest wywoływana, gdya
zmieniła się (przezreset!
lubswap!
) sprawdza, czy warunki są spełnione. Może to być przykład implementacji zachowania podzakresów w późno wiążących językach (patrz http://blog.fogus.me/2011/09/23/clojurescript-watchers-and-validators/ ).źródło
for y in Year_Type loop ...
eliminując problemy takie jak przepełnienie bufora.Ada jest także językiem, który dopuszcza ograniczenia dla prostych typów, w rzeczywistości w Adzie dobrą praktyką jest definiowanie własnych typów dla swojego programu, aby zagwarantować poprawność.
Był używany przez długi czas przez DoD, może nadal jest, ale straciłem świadomość jego obecnego użycia.
źródło
Zobacz Ograniczanie zakresu typów wartości w C ++, aby dowiedzieć się, jak utworzyć typ wartości z kontrolą zakresu w C ++.
Streszczenie: Użyj szablonu, aby utworzyć typ wartości, który ma wbudowane wartości minimalne i maksymalne, których możesz użyć w następujący sposób:
Tak naprawdę nie potrzebujesz tutaj szablonu; możesz użyć klasy z podobnym skutkiem. Korzystanie z szablonu pozwala określić typ bazowy. Ponadto należy zauważyć, że typ
percent
powyższym nie będziefloat
, ale raczej instancja szablonu. To może nie spełniać aspektu „prostych typów” pytania.Proste typy są po prostu takie - proste. Często są najlepiej stosowane jako elementy składowe do tworzenia potrzebnych narzędzi zamiast bezpośredniego użycia.
źródło
Pewna ograniczona forma twojego zamiaru jest według mojej wiedzy możliwa w Javie i C # poprzez kombinację Adnotacji i Dynamicznego Wzorca Proxy (istnieją wbudowane implementacje dla dynamicznych proxy w Javie i C #).
Wersja Java
Adnotacja:
Klasa Wrapper tworząca instancję proxy:
InvocationHandler służący jako obejście przy każdym wywołaniu metody:
Przykładowy interfejs użytkowania:
Główna metoda:
Wynik:
Wersja C #
Adnotacja (w języku C # o nazwie atrybut):
Podklasa DynamicObject:
The ExampleClass:
Stosowanie:
Podsumowując, widzisz, że możesz dostać coś takiego do pracy w Javie , ale nie jest to do końca wygodne, ponieważ
Możliwości klasy DynamicObject w C # usuwają ograniczenia interfejsu, jak widać w implementacji C #. Niestety, takie zachowanie dynamiczne usuwa w tym przypadku bezpieczeństwo typu statycznego, dlatego konieczne jest sprawdzenie środowiska wykonawczego w celu ustalenia, czy dozwolone jest wywołanie metody na dynamicznym serwerze proxy.
Jeśli ograniczenia te są dla Ciebie dopuszczalne, może to stanowić podstawę do dalszego kopania!
źródło
public virtual int Min { get; private set; }
to fajna sztuczka, która znacznie skróciłaby Twój kodZakresy są szczególnym przypadkiem niezmienników. Z Wikipedii:
Przedział
[a, b]
może być uznana jako zmienna x typuInteger
z Niezmienniki x> = a i x <= b .Dlatego typy podzakresów Ada lub Pascal nie są absolutnie konieczne. Można je zaimplementować za pomocą liczb całkowitych z niezmiennikami.
źródło
Specjalne funkcje dla typów ograniczonych zasięgiem nie są potrzebne w C ++ i innych językach z potężnymi systemami typów.
W C ++ twoje cele mogą być osiągnięte stosunkowo prosto dzięki typom zdefiniowanym przez użytkownika . A w aplikacjach, w których pożądane są typy o ograniczonym zasięgu, nie są one wystarczające . Na przykład, chcielibyśmy również, aby kompilator sprawdził, czy obliczenia jednostek fizycznych zostały poprawnie zapisane, tak aby prędkość / czas wytwarzała przyspieszenie, a przyjmowanie pierwiastka kwadratowego przyspieszenia / czas dawało prędkość. Wykonanie tego w wygodny sposób wymaga umiejętności zdefiniowania systemu typów, bez wyraźnego nazywania każdego typu, który mógłby kiedykolwiek pojawić się w formule. Można to zrobić w C ++ .
źródło