Domanda

Perché non openGL orientata agli oggetti? Ognuno insegna Object Oriented Programming + Design Patterns, ma OpenGL ha molte funzioni globali. Non è questo cattivo stile?

È stato utile?

Soluzione

Il punto centrale di un basso livello API è quello di rendere quanto più contenuti e portabile possibile. Dandogli un'architettura orientata agli oggetti non avrebbe permesso questo:

  • Il polimorfismo aggiunge chiamata di funzione inutili spese generali.
  • Ti costringe ad utilizzare alcuni relativamente difficile convenzione di chiamata, che riduce la portabilità.
  • Non si può avvolgere un'architettura orientata agli oggetti per renderlo procedurale, ma si può fare il contrario; così, ha senso per rendere le cose il più flessibile possibile. E 'banale scrivere un involucro orientato agli oggetti intorno a OpenGL, se vuoi.

Infine, si dovrebbe davvero mettere in discussione ciò che è stato insegnato su OOP. Nonostante quello che il tuo college o università possono dire, OOP non è una panacea di progettazione del programma. Ci sono buone ragioni per cui non v'è assolutamente alcun oggetto-orientamento in C ++ STL (e la maggior parte Boost per questo).

Oggetto-orientamento è utile in alcuni casi, ma si dovrebbe imparare quando è utile, e quando non lo è, e in nessun caso si deve credere che tutto ciò che non è OOP è "cattivo stile".

Altri suggerimenti

OpenGL

  • OpenGL dovrebbe sostenere tutte le piattaforme - non c'è niente vicino a C in questo senso - grazie a che quasi ogni dispositivo può utilizzare la stessa API
  • OpenGL dovrebbe supportare tutte le lingue - c'è anche niente vicino a C in questo senso - grazie a ciò, ogni lingua che consente di chiamare librerie C (e quasi tutti lo fanno) possono utilizzare OpenGL
  • OpenGL è un'API, non un motore - intende fornire basso livello interfaccia per la grafica harware, eppure il livello abbastanza alto, per essere un'astrazione di diverse parti metalliche - C è molto livello più basso di C ++, OOP non è di basso livello
  • OpenGL è un quadro su cui costruire, non una soluzione completa - non esiste un codice grafico unico e vero modo per scrivere, e OpenGL non dovrebbe costringerci a qualsiasi cosa - per essere OOP che ci costringerebbe a loro "colution
  • OpenGL è non legato a qualsiasi paradigma di programmazione specifica - quindi siamo in grado di avvolgere OpenGL in un linguaggio funzionale, logico o OOP - o usarlo procedurale
  • OpenGL è di circa l'efficienza - e non è possibile ottenere più efficiente rispetto da chiamate di funzione dirette. OOP è efficiente come esso è adatto per un particolare compito.

In generale - OpenGL è progettato per consentire di avere tutta la libertà, e non fanno tutte le scelte per noi. E per libertà che la libertà media scegliere una piattaforma, una lingua, un paradigma di programmazione, un disegno di motore, una metodologia, e un livello di efficienza rispetto leggibilità.

E per questo lodo OpenGL, e per questo io odio Direct X.

Amen.

Nota a margine: Ognuno insegna oggetto di programmazione Orientata perché è il più facile da cogliere. Non è l'unico e solo vero paradigma. C'è programmazione funzionale, la programmazione logica, contratto di programmazione, e anche un oggetto orientato modo di scrivere in C. Non c'è una verità in informatica. Per quanto riguarda il Design Patterns, potrei nominare più di un paio che sono utilizzati in architettura di OpenGL. Bad Style? Ho visto belle programmi C che avevano aaaaallll funzioni globali ...

In generale, OpenGL è object oriented. E 'appena implementato in una lingua che non supporta direttamente OOP. Ma l'API è orientato agli oggetti: Si compone di una serie di diversi tipi di oggetti, e un insieme di operazioni definite su ciascuna. E gli elementi interni di ogni tipo di oggetto sono nascosti all'utente. Esso soddisfa tutti i requisiti per OOP. Si dà il caso di essere implementato in C, che non ha una comoda classe o membro sintassi del metodo.

Oltre a questo, non c'è assolutamente niente di sbagliato con funzioni globali. In C ++, una raccomandazione comune è preferire loro più metodi utente quando possibile. In tecniche di programmazione funzionale, funzioni globali sono quelle di default.

EL CONCLUSION

Dopo un ulteriore debug di qualcosa si è distinto come un pollice dolente che originariamente ho trascurato, quella era la funzionalità fondamentale interrotta come al solito:

Alla fine Varien_Db_Data_Collection viene ereditato così quando eseguo toOptionArray o toOptionHash Nessun argomento è analizzato quindi perché NULL è apparente

Soluzione 1

è quello di assicurarsi di utilizzare solo id come campo ID e name come campo del tuo valore.

Soluzione 2

Per estendere Mage_Core_Model_Resource_Db_Collection_Abstract Implementazione dei metodi toOptionHash e toOptionArray per sovrascrivere quelli definiti all'interno Varien_Db_Data_Collection:

public function toOptionArray($idField = 'id', $valueField = 'name', $additional = [])
{
    return $this->_toOptionArray($idField, $valueField, $additional);
}

public function toOptionHash($idField = 'id', $valueField = 'name', $additional = [])
{
    return $this->_toOptionHash($idField, $valueField, $additional);
}
.


.

Questo è lo snippet da lib / varien / db / dati / raccolta.php per evidenziare il problema scoperto.

protected function _toOptionArray($valueField='id', $labelField='name', $additional=array())
{
    $res = array();
    $additional['value'] = $valueField;
    $additional['label'] = $labelField;

    foreach ($this as $item) {
        foreach ($additional as $code => $field) {
            $data[$code] = $item->getData($field);
        }
        $res[] = $data;
    }
    return $res;
}

public function toOptionArray()
{
    return $this->_toOptionArray();
}

public function toOptionHash()
{
    return $this->_toOptionHash();
}

protected function _toOptionHash($valueField='id', $labelField='name')
{
    $res = array();
    foreach ($this as $item) {
        $res[$item->getData($valueField)] = $item->getData($labelField);
    }
    return $res;
}
.

Bene, ci sono un paio di motivi.

  • Si dovrebbe pensare ad un contesto OpenGL come una macchina a stati. C'è solo uno di loro attiva in qualunque momento. Non c'è differenza tra mettere un po 'di Opengl.whatever di fronte a tutto ciò.
  • Velocità, OpenGL è stato progettato per essere un minimo API
  • Se si è orientato agli oggetti, che lingua vuoi scrivere altrove? C ++? Allora tutti avrebbero possiate avere a scrivere attacchi complessi. C è modo più semplice per avvolgere.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top