Nella nostra azienda abbiamo un codice JavaScript basato su PrototypeJS piuttosto ampio, che stiamo eseguendo il porting su jQuery per diversi motivi (non molto importanti qui). Sto cercando di impostare le linee guida di codifica per rendere / tenere le cose in ordine durante il porting.
Un'osservazione che emerge dall'implementazione basata sul prototipo è che un sacco di codice è scritto in stile OOP (usando Prototype Class.create
), ma il codice non è "orientato agli oggetti" nello spirito.
Lo schema generale che ho visto: un "costruttore" che ci si aspetta di chiamare (ma non chiamare due volte, perché il costruttore usa gli ID DOM hardcoded), un mucchio di altre "funzioni" e gestori di eventi, che non ci si aspetta chiama (ma perché non c'è "privato" in JavaScript, non lo sai) e la condivisione dei dati tra tutte queste funzioni tramite this
. Visto dal punto di vista del chiamante c'è solo un "callable" e nient'altro.
Sto iniziando a credere che OOP in JavaScript possa e forse dovrebbe essere evitato in molti casi. Almeno per il nostro caso d'uso, che non è l'interfaccia utente di Goole Wave di prossima generazione, ma semplicemente messo: un po 'di miglioramenti basati su AJAX, registrazione di alcuni gestori di eventi qua e là, manipolazioni DOM minori e simili.
- la funzionalità di cui abbiamo bisogno sembra essere implementabile nel tipico modo jQuery non-OOP, usando la magia di chiusura per ottenere l'incapsulamento e la privateness. Come effetto collaterale, l'efficienza di minification del codice ported è molto migliore.
- OOP in JavaScript non è tradizionale e confuso se provieni da uno sfondo "tradizionale". Ci sono molti tentativi e schemi per approssimare l'OOP tradizionale, ma IMHO rende le cose ancora più confuse e fragili.
- Una cosa che mi ha insegnato "JavaScript the good parts" di Crockford è che il vero potere di Javascript risiede negli ambiti delle funzioni e nelle chiusure, tanto meno nei modelli OOP.
Mi chiedo se ci sia un più ampio supporto per questa sensazione che l'OOP in JavaScript non lo tagli davvero come il mantra sacro, come in altre lingue / piattaforme. E, in estensione, che tipo di pattern basati su OOP / chiusura sono molto più preferibili.