Ostatnio, przypadkowo natrafiłem na wykład Stroustrupa, dotyczący wybranych zmian wprowadzanych przez nowy standard C++. Moją uwagę przykuło zagadnienie, nazywane przez prelegenta, jako type-rich programming. W skrócie chodzi o definiowanie możliwie, jak najsilniej typowanego interfejsu. Stroustrup rozumie przez to przygotowanie, takiego interfejsu, który pociąga za sobą semantykę. Interfejs ma jednoznacznie wskazywać z jakim rodzajem obiektu mamy do czynienia.
Antyprzykładem może być np. abstrakcyjna deklaracje funkcji rysujących prostokąt:
bool DrawRectangle(const double x1, const double y1, const double x2, const double y2);
bool DrawRectangle(const double x1, const double y1, const double diagonal);
Stroustrup powiedziałby, że typ
const double
nie identyfikuje, jednoznacznie z jakiego rodzaju danymi mamy do czynienia. Musimy domyslać, się co onaczają poszczególne argumenty tych funkcji. (Okey, można by nadać argumentom lepsze nazwy, ale to nadal nie dotyka nie dotyczy istoty problemu).
Pomysł na rozwiązanie problemu, według Stroustrupa polaga na użyciu np. szablonów, bądź przeładowania operatora
operator ""
Poniżej wycinek kodu z prezentacji Stroustupa (nie testowałem, czy to w ogóle działa)
template<int M, int K, int S> struct Unit
{
enum {m = M, k = K, s = S };
};
template<typename Unit>
struct Value {
double val;
explicit Value(double d) : val(d) { }
};
using Second = Unit<0, 0, 1>;
using Meter = Unit<1, 0, 0>;
using Speed = Unit<1, 0, 1>;
constexpr Value<Second> operator"" s(long double _s) { return Value<Second>(_s); }
constexpr Value<Meter> operator"" m(long double _m) { return Value<Meter>(_m); }
Speed currentSpeed = 100m / 9.81s;
Przechodząc już do pytania. Czy ktoś z Was kiedykolwiek stosował, aż tak silne typowanie? Czy Waszym zdaniem jest w ogóle miejsce na takie tworzenie interfejsów? Moim zdaniem, jeśli aplikacja działa na zbiorze danych silnie zróżnicowanym pod względem typu, takie działanie byłoby strzeleniem sobie samobója już na starcie.
Linki:
Wykład
Prezentacja