Natrafiłem na problem, który zaczyna mnie denerwować – niby proste, a trudne.
Mój konsolowy program do generowania schematów blokowych w ASCII art (JavaScript, Node.js; pisałem już o nim w tym wątku) przyjmuje kilka argumentów. Jego wywołanie ma taki schemat:
node nazwa-pliku.js {nazwa-parametru} {lista-wartości} {nazwa-parametru} {lista-wartości} ... -- {lista-zawartości-bloków}
Argumenty {nazwa-parametru} mają zdefiniowane nazwy w kodzie programu jako typ String – na przykład "-w" czy "-b" – a argumenty {lista-wartości} następujące po poszczególnych parametrach odpowiadają tym parametrom. Czyli każdemu argumentowi-parametrowi może odpowiadać lista argumentów-wartości o dowolnej długości – 1, 2, 3… (w programie, dla wygody użytkownika, ustaliłem długości tych list na od 1 do 2). Przykładowo wygląda to tak:
paramsConfig = {
"-w": {
// Tu konfiguracja dla parametru "-w"
},
"-b": {
// Tu konfiguracja dla parametru "-b"
},
...
}
Z drugiej zaś strony użytkownik wywołując program spodziewa się schematu blokowego, który jest generowany przez funkcję constructSchema(schemaConfig). Żeby stworzyć schemat, muszę wcześniej stworzyć poszczególne jego bloki, wywołując funkcję constructBlock(blockConfig). Obie te funkcje przyjmują jako swoje argumenty swoją konfigurację.
Problem, z którym przychodzę w tym wątku, polega na tym, że muszę zmapować jeden zestaw wartości na drugi – konfigurację podaną w wierszu poleceń na konfiguracje w wywołaniach funkcji.
Obecne moje rozwiązanie wygląda tak, że wywołuję funkcje constructSchema oraz constructBlock i ręcznie mapuję jedne wartości na drugie. Czyli przykładowo:
const schema = constructSchema({
{nazwa-właściwości-A}: parsedArgs["-w"],
{nazwa-właściwości-B}: parsedArgs["-b"],
{nazwa-właściwości-C}: parsedArgs["-w"]
...
});
gdzie parsedArgs jest obiektem zawierającym argumenty z wiersza poleceń zwalidowane i w odpowiednim formacie.
Jest to rozwiązanie o tyle brzydkie, że za każdą zmianą konfiguracji podawanej w wierszu poleceń:
- dla każdego zmienionego parametru muszę wyszukiwać miejsca w wywołaniach funkcji, w których go podałem;
- dla każdego zmienionego parametru, jeśli zmieniła się jego nazwa, to muszę zmieniać ją zarówno w wywołaniu funkcji, jak i w konfiguracji wiersza poleceń.
Że nie wspomnę już o tym, że jak obecnie próbuję przepisać to na coś lepiej zaprojektowanego, to nie mam pomysłu, w którym miejscu podawać wartości domyślne dla parametrów (niektóre parametry wiersza polecenia nie są wymagane, a inne są). To nie należy już to mojego problemu, z którym przychodzę, ale gdyby ktoś dodatkowo mógł coś zaproponować w tym zakresie, to byłbym wdzięczny.
UPDATE: Podsumowując, pisanie tego posta zajęło mi więcej czasu, niż powinienem przeznaczyć na projektowanie takiej funkcjonalności mapowania… a jednak nie potrafię. Czy ktoś więc miałby jakieś pomysły, jak wykonać takie mapowanie, o jakim piszę? Może w którymś miejscu opisuję rzecz bezsensowną z punktu widzenia takiego programu? Może w ogóle nie ma problemu, tylko ja go wymyśliłem, przeinżynierowywując wszystko? Chętnie przyjmę krytykę, byle tylko udało się to zaprojektować.