L'unico posto in cui ho davvero notato questo tipo di stile di programmazione è con i motori grafici. Essenzialmente come questo :
graphics.clear()
graphics.setStrokeStyle(myStrokeWidth)
graphics.beginStroke(myStrokeColor)
graphics.beginFill(myFillColor)
for (i = 0; i < myPoints.length; i++) {
graphics.lineTo(myPoints[i][0], myPoints[i][1])
}
graphics.closePath()
graphics.endStroke()
graphics.endFill()
Inizi il processo con beginFill
, quindi fai un disegno e poi termina con endFill
. Cioè, un singolo pezzo di funzionalità (che riempie la grafica) viene eseguito su più chiamate di metodo piuttosto che una sola:
graphics.fill(...)
In realtà non conosco un altro posto che faccia così, ed è per questo che mi chiedo da dove viene questo paradigma. Mi chiedo se è per motivi di prestazioni, o per qualche altro motivo. Inoltre sarebbe interessato in quale altro si apre, ma non è necessario per la domanda.
La domanda è: perché è fatta in questo modo. Vorrei invece implementarlo come graphics.fill(...)
. Sotto il cofano (con il paradigma multi-step begin / end, (oh un altro tipo di simile è con tag LaTeX o HTML begin / end, ma non esattamente lo stesso), dovresti impostare una variabile globale localmente (es. contesto grafico) che verrebbe modificato. È come fare:
var currentFill
graphics.beginFill = function(){
currentFill = { lineTos: [] }
}
graphics.lineTo = function(point) {
currentFill.lineTos.push(point)
}
graphics.endFill = function() {
graphics.draw(currentFill)
currentFill = null
}
Un altro modo di farlo sarebbe passarlo (sembra come lo faresti oggigiorno):
graphics.beginFill = function(){
return {}
}
graphics.lineTo = function(fill, point){
fill.lineTos.push(point)
}
graphics.endFill = function(fill){
draw(fill)
}
Quindi, chiedendo se c'è una sorta di storia per questo, o se si tratta di una cosa di ottimizzazione o qualcos'altro. Sembra un anti-pattern perché c'è uno stato nascosto, ma non è sicuro.