Il paradigma di programmazione dietro beginFill / endFill

6

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.

    
posta Lance Pollard 19.08.2018 - 05:29
fonte

2 risposte

1

Il "paradigma" dietro a questo (se piace chiamarlo così) è semplicemente l'idea di usare parentesi come una forma di raggruppamento. Wikipedia riporta le radici storiche di questo concetto al 1608.

Specificamente per il caso d'uso descritto, direi che l'idea è di evitare di avere tonnellate di comandi lineTo che devono essere passati più e più volte lo stesso parametro fill , il che renderebbe il codice più "rumoroso". Quindi sì, è un "ottimizzazione", ma non riguarda le prestazioni, ma la leggibilità.

Nota Il pacchetto tartaruga di Python sembra avere una simile sintassi di riempimento . È stato ispirato dalla logo della tartaruga grafica, ma la sintassi di riempimento originale in Logo era leggermente diversa.

    
risposta data 22.12.2018 - 09:23
fonte
0

Non so quanto tempo fa, ma è molto simile all'API Mac QuickDraw originale. OpenRgn e CloseRgn.

Fondamentalmente è solo una variazione su ciò che oggi viene chiamato il modello di builder.

    
risposta data 22.12.2018 - 13:56
fonte

Leggi altre domande sui tag