2017-11-22 103 views
5

W this question, zapytałem, jak zdefiniować nieograniczoną górną granicę dla zakresu (okazuje się, że odpowiedź była dość oczywista, ale nie dla kogoś nowego do Ady). W odpowiedzi zasugerowano utworzenie dla tego podtypu Określony podtyp.W Adzie wydaje się, że ogólną praktyką jest deklarowanie konkretnych podtypów, ale dlaczego?

Specyficzny podtyp tego rodzaju, o którym mowa w pytaniu będzie wyglądać następująco:

Type Speed is Float range 0 .. Float'Last 

Dodatkowo zauważyłem, że spora część kodu w tym projekcie Ada ma specyficzne typy - jak Feet_Float i Meters_Float i tym podobne. Dlaczego jest to preferowana praktyka, a nie tylko umieszczanie ograniczenia zakresu dla podstawowej zmiennej float w klasie/pakiecie?

+1

Co ty opisujesz to specyficzny typ, a nie podtyp. –

+0

Zobacz także [to] (https://stackoverflow.com/questions/23220161/what-is-the-point-of-renaming-types-in-ada) – NWS

Odpowiedz

8

Ada nie preferuje podtypów - robią to programiści Ada.

Nowe typy i podtypy (są różne, a obie mają swoje zastosowania) pomagają wykryć tak wiele błędów przy tak niewielkim koszcie lub w czasie, że jest tajemnicą, dlaczego dobre systemy typu spadły tak daleko poza modę.

Na przykład uznać, że wskaźnik dla każdej tablicy należy do podtypu (być anonimowy, ale dostępne jako myArray'range jak w for i in myArray'range loop ... end loop; lub subtype myIndextype is myArray'range; theIndex : myIndextype; i zobaczysz, że każdy Przepełnienie bufora - lub atak - kiedykolwiek napisana była po prostu błąd typu - lub mógł być, w Ada:

Gdy pojawi się błąd za kompilatorem, po raz pierwszy twój plik wykonywalny przewróci się z Exception : Constraint_Error wskazując strasznie blisko błędu, zaczniesz mieć poczucie wartość typów ograniczonych zakresami:

Aby się nieco rozwinąć, odniosę się do jeszcze kilku Q & As.

Najpierw zauważ, że kompilator, którego prawdopodobnie używasz, Gnat, może nie być ściśle zgodny z Adą, chyba że dodasz kilka opcjonalnych flag w wierszu poleceń (lub pliku projektu), jak opisano w pierwszym przykładzie. Ostatnie wersje domyślnie włączają niektóre z nich.

Oto przykład bloku subtype being declared, used and going out of visible scope, (w bloku declare, w którym zakres podtypu jest nieznany do czasu wykonania.W przeciwieństwie do wielu języków z dynamicznym typowaniem, jest to zarówno szybkie, jak i bezpieczne, ponieważ odpowiednie miejsce przechowywania jest zwykle na stosie, jeśli jesteś zainteresowany szczegółami implementacji.

a przykładem how not to use a declare block.

Oto skrajnym przykładem not only declaring subtypes but telling the compiler how to pack them in storage.Powszechnie stosowane w programowaniu wbudowanym, zarówno w miejscu, w którym jest mało miejsca (mam pełny cyfrowy zegarek w procesorze z pamięcią 1k!), Jak i w celu uzyskania dostępu do określonych bitów w rejestrach sprzętowych. (Zauważ, że ten przykład będzie czystszy, jeśli zaktualizowany do użycia Ada-2012 .)

A to Q & Krótko obejmuje difference between new types and subtypes, dla kogoś pochodzącego z Jawy. (Jestem trochę rozczarowany, że żaden z ekspertów Javy nie zdołał rozwiązać problemu przed jego zamknięciem, opisując, w jaki sposób poradziliby sobie z tymi samymi problemami).

3

Deklaracja konkretnych typów ma następujące zalety:

  • Szczególne rodzaje zapobiec nieodpowiednie wymieszanie abstrakcji. Na przykład, dzieląc odległość między Księżycem a Ziemią w metrach przez narodowy produkt narodowy Belgii wyrażony w euro.
  • Nazwa typu bardziej dokładnie dokumentuje zamierzone użycie typu
  • Stosowanie typów zakresowych wyraźnie dokumentuje poprawne wartości wystąpień typu.
+0

Dobrym przykładem jest zapobieganie mieszaniu funtów-sekund i sieci -seconds, który był główną przyczyną katastrofy Mars Climate Orbiter (https://en.wikipedia.org/wiki/Mars_Climate_Orbiter) –

+0

Chociaż tak jest rzeczywiście, podejrzewam, że użycie określonych podtypów w kontekście MCO nie miałoby było pomocne. Nie chodziło tu o programowanie oprogramowania, ale raczej o kwestię weryfikacji interfejsu systemowego - dodatkowo proces inżynierii systemów zepsuł się podczas misji, gdy błąd powinien zostać wykryty i naprawiony. – theMayer

4

Paradygmat w Ada polega na modelowaniu problemu w rozwiązaniu. Jednym z aspektów tego jest modelowanie zakresu, dokładności i precyzji wartości w przestrzeni problemu z odpowiednimi definicjami typu skalarnego i podtypu.

Dlaczego należy to zrobić? McCormick, analizując dlaczego studenci z doświadczeniem C i bez doświadczenia Ada były w stanie ukończyć projekt swego czasu rzeczywistego S/W Oczywiście w Ada, ale nie w C stwierdzono, że najważniejszą cechą Ady był

Modelowanie skalara obiekty.

  • Silne pisanie.
  • Ograniczenia zakresu.
  • Typy wyliczeń.

McCormick's paper

McCormick's site

+0

OP o nazwie 'Feet_Float' i' Meters_Float'. Ada 2012 ma funkcję, która może być interesująca oprócz typów/podtypów i sprawdzeń ograniczeń: wymiary. Można odwołać się do tego linku https://www.adacore.com/gems/gem-136-how-all-is-a-kilogram. Cytat: 'Ta cecha zależy od specyfikacji aspektu Ada 2012 i jest dostępna od wersji 7.0.1 GNAT. Kompilator GNAT obsługuje teraz sprawdzanie wymiarów. Może to być również echo innych komentarzy dotyczących awarii Mars Climate Orbiter. – LoneWanderer

Powiązane problemy