Ok, un flip-flop completo di ciò che avrei intenzione di scrivere, basato su due parti specifiche della domanda:
we had 200 offshore devs of varying levels code illiteracy (completely on the low end, not kidding)
e
Why would sharing attributes there ever cause a problem?
I ho eseguito in qualcosa di simile a questo nel progetto al quale sto lavorando al momento. Ciò di cui mi occupavo è ciò che accade quando i programmatori inesperti legano interamente le funzionalità alle classi, senza pensare a conseguenze o manutenibilità. (Cioè, erano riusare classi solo perché sono lì e si trovano su tutti gli elementi giusti)
Quello che stai guardando è un modo semplice, simile a una mazza, per rafforzare la separazione delle preoccupazioni sui programmatori non qualificati.
Se le funzionalità sono strettamente legate agli ID e progettano in Classi, allora possono cambiare entrambi senza doversi preoccupare dell'altro. Ciò è particolarmente utile dal punto di vista del design: purché includano tutti gli ID necessari per la funzionalità Javascript, stanno bene.
Detto questo, io strongmente non sono d'accordo con questo approccio (vedi altre risposte sul perché). È estremamente limitante anche per i programmatori decenti e quasi sempre richiede javascript di contabilità extra per tenere traccia di #foo_1
, #foo_2
... quando .foo
sarebbe stato sufficiente.
EDIT @jmoreno ha sottolineato che mi mancava il paragrafo di chiarimento in alto, quindi ora parti della mia risposta originale sembrano molto più appropriate. Tempo aneddotico personale!
Vedi, al lavoro, abbiamo una libreria scritta in Django + JS + CSS, condivisa tra una grande fetta dei nostri prodotti. È stato scritto in un modo molto specifico, pensato per essere altamente configurabile e incluso in vari progetti tramite un template templatetag Django con argomenti usati per la configurazione del JS.
Purtroppo, perché il JS e il CSS erano legati insieme condividendo le classi, significava che alcune funzionalità che guardavano come opzioni completamente separate potevano funzionare solo se entrambe erano specificate, o entrambi erano rimasti fuori. E si escludevano a vicenda con un terzo. Qualsiasi altra combinazione ha causato l'errore di JS, perché avrebbe fatto supposizioni su quali classi esistessero nell'HTML generato.
Avevamo bisogno delle opzioni 2 e 3, ma non 1. Questa è stata una sfortuna, per non dire altro: ad esempio, l'Opzione 1 includeva le classi in stile CSS per l'opzione 2 JS (che usava solo perché, come descritto sopra, le classi erano già lì quindi perché no?) . Quindi se hai usato l'Opzione 2 senza l'Opzione 1, ci sarebbe stata così tanta sfregiatura stilistica che sarebbe diventata inutilizzabile.
Ho battuto quel JS in sottomissione per circa tre mesi a questo punto, rendendo tutte e 3 le opzioni indipendenti l'una dall'altra e stirando i bug.
Questo lavoro extra non avrebbe dovuto essere necessario, e non lo sarebbe stato se l'intera faccenda fosse stata scritta bene all'inizio. Separare in modo forzato le classi su cui agiscono JS e CSS avrebbe contribuito a impedire che l'Opzione 1 e l'Opzione 2 venissero legati insieme quando era stato scritto per la prima volta.
Detto questo, in genere non è possibile essere al 100% su questa regola. Uno di questi è una semplice classe .loading
che viene aggiunta / rimossa se necessario.