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ć.
albo min, max były by obiektami z property DeclaredBlockHeigh
– chyba się powstrzymam przed tak niestandardową konfiguracją. :P