Opis problemu w tytule mnie samego bawi, ale inaczej nie umiem sformułować. Może wcale problemu nie ma, a tylko ja przeinżynierowywuję?
Idzie to tak: mam ciąg znaków:
to-jest-ciąg-znaków
Chcę stworzyć drugi ciąg znaków – reprezentujący pudełko – który wynikowo będzie tak wyglądał:
to-je
st-ci
ąg-zn
aków
Kluczowe jest, że po stworzeniu tego pudełka chciałbym, żeby można było je "opakować" – by wyglądało wynikowo tak:
#######
#to-je#
#st-ci#
#ąg-zn#
#aków #
#######
W tym celu stworzyłem dwie metody: createBox
oraz wrap
. Żeby utworzyć powyższe, opakowane pudełko, wywoływałoby się je w ten sposób (mój wymarzony, elegancki sposób):
const content = "to-jest-ciąg-znaków";
const boxConfig = {
... // coś tam
};
const cell = "#";
const frameSize = 1;
const box = createBox(boxConfig, content).wrap(cell, frameSize);
console.log(box.data.map(row => row.join("")).join("\n"));
W pliku create-box.js
mam moduł z funkcją, która tworzy pudełko:
const wrap = require("./wrap").wrap;
exports.createBox = function (config, content) {
const data = [];
... // dużo operacji na tablicy data
return {
data: data,
..., // pozostałe właściwości
wrap: (cell, frameSize) => wrap(???, cell, frameSize)
};
}
Metoda wrap
jest zdefiniowana w module, który jest w pliku wrap.js
, i wygląda tak:
exports.wrap = function (box, cell, frameSize) {
const wrappedData = [];
... // dużo operacji na tablicy wrappedData
return {
data: wrappedData,
..., // pozostałe właściwości
wrap: (cell, frameSize) => module.exports.wrap(???, cell, frameSize)
};
}
Względem powyższego kodu mój problem można zdefiniować krótko: co umieścić w miejscu oznaczonym "???"?
Myślałem o słowie kluczowym this
, bo w końcu zwracany jest obiekt, który mamy właśnie opakować. Jednak nie działa – w momencie wywołania this
evaluates do globalnego obiektu (nie wiem, jak po polsku powiedzieć evaluates).
PS.
- Całość powinna działać w Node.js.
- Przez "moment wywołania" wspomniany wyżej mam na myśli wywołanie w pliku, powiedzmy,
index.js
, który wykonywany jest poleceniemnode index.js
.
PS2.
W powyższej implementacji mojego pomysłu chodzi o to, żeby metodę wrap
można było wywoływać na tym, co zwraca. Dzięki temu można by osiągnąć na przykład taki ładny (?) ciąg wywołań:
const box = createBox(...).wrap("#", 1).wrap("$", 2).wrap("@", 1);
PS3. Jeśli macie jakieś uwagi na temat powyższej architektury, chętnie poznam. Może da się osiągnąć prościej, co sobie zamierzyłem?