Ostatnio szukałem jakiegoś sympatycznego sposobu na wzbogacenie aplikacji w RoR o jakąś formę prostego AI/machine learning. Znalazłem kilka algorytmów, ale nic, co można by w lekki, łatwy i przyjemny sposób zaimplementować.
Spróbowałem swoich sił i napisałem bibliotekę, póki co tylko na GitHubie:
Choć to bardziej ‘Proof of Concept’ niż gotowy produkt (chociaż działa), dajcie proszę znać, co o tym sądzicie.
class Cat
extend(Cabalist)
acts_as_cabalist( :fields => [ :light_or_dark, :gender ],
:category => :good )
Czy naprawdę ta 1 linijka więcej (extend) to jest jakieś zło, że wszyscy tworzą api, które rozszerza jakieś już istniejące klasy (Object, albo zwykle ActiveRecord::Base). Nie mogę tego znieść.
Druga rzecz to nie podoba mi się taki global:
Cabalist::Manager.setup!
Wolałbym coś w stylu:
manager = Cabalist::Manager.new()
Cat.cabalist_manager = manager # albo może w drugą stronę manager.manage(Cat)
manager.setup!
Wtedy łatwo mogę tworzyć różne managery, testować je itp. Zawsze lepiej tworzyć api, które umożliwia więcej a jak ktoś chce się ograniczyć do jednego globala to jego sprawa.
W kwestii zaśmiecenia klasy Object przyznaję się do winy i dobrowolnie poddaję karze. Poszedłem za (złym) przykładem innych pluginów. Zmienię to tak jak sugerujesz.
Co do managerów to też się zgadzam - chcę umożliwić także tworzenie wielu klasyfikatorów dla jednej klasy - będzie dostępna dodatkowa opcja (:name). Tak czy inaczej zostawię Cabalist::Manager jako singletona.
Tak więc uruchomienie każdego konkretnego klasyfikatora będzie się odbywać tak: