Niektórzy mówią, że jeśli doprowadzisz ich ekstremalne zasady do SOLID, skończysz na programowaniu funkcjonalnym . Zgadzam się z tym artykułem, ale myślę, że niektóre semantyki zostały utracone podczas przejścia z interfejsu / obiektu do funkcji / zamknięcia i chcę wiedzieć, w jaki sposób programowanie funkcjonalne może złagodzić utratę.
Z artykułu:
Ponadto, jeśli rygorystycznie zastosujesz zasadę segregacji interfejsów (ISP), zrozumiesz, że powinieneś faworyzować interfejsy ról zamiast interfejsów nagłówka.
Jeśli nadal będziesz kierować swoim projektem w kierunku coraz mniejszych interfejsów, ostatecznie dojdziesz do ostatecznego interfejsu roli: interfejsu z jedną metodą. To mi się często zdarza. Oto przykład:
public interface IMessageQuery
{
string Read(int id);
}
Jeśli wezmę zależność od IMessageQuery
, częścią niejawnej umowy jest to, że wywołanie Read(id)
wyszuka i zwróci wiadomość o podanym identyfikatorze.
Porównajmy to do robienia zależność od jego odpowiednik podpisu funkcjonalnej int -> string
. Bez dodatkowych wskazówek ta funkcja może być prosta ToString()
. Jeśli wdrożysz IMessageQuery.Read(int id)
za pomocą ToString()
I, mogę cię oskarżyć o celową wywrotę!
Co zatem mogą zrobić funkcjonalni programiści, aby zachować semantykę dobrze nazwanego interfejsu? Czy konwencjonalne jest na przykład tworzenie typu rekordu z jednym elementem?
type MessageQuery = {
Read: int -> string
}
Without any additional clues
... może dlatego dokumentacja jest częścią umowy ?