Poche lingue sono restrittive quanto Java con gli standard di denominazione dei file e la struttura del progetto. In quella lingua, il nome del file deve corrispondere alla classe pubblica dichiarata nel file e il file deve vivere in una struttura di directory corrispondente al pacchetto di classi. Ho sentimenti contrastanti su questo approccio. Mentre non devo mai indovinare dove vive un file, ci sono ancora molte directory vuote e vincoli artificiali.
Ci sono diverse lingue che definiscono tutto su una classe in un file, almeno per convenzione. C #, Python (credo), Ruby, Erlang, ecc. La comunanza nella maggior parte di questi linguaggi è che sono orientati agli oggetti, anche se questa affermazione può probabilmente essere respinta (c'è già una lingua non OO nella lista).
Infine, ci sono alcuni linguaggi per lo più nella famiglia C che hanno un'intestazione e un file di implementazione separati. Per C penso che abbia senso, perché è uno dei pochi modi per separare l'interfaccia API dalle implementazioni. Con C sembra che la funzionalità sia utilizzata per promuovere la modularità. Tuttavia, con C ++ il modo in cui i file di intestazione e implementazione sono divisi sembra piuttosto forzato. Non si ottiene la stessa separazione API pulita che si fa con C, e si è costretti a includere alcuni dettagli privati nell'intestazione che si preferisce mantenere solo nell'implementazione.
Ci sono alcune lingue che hanno un concetto che si sovrappone a interfacce come Java, C #, Go, ecc. Alcuni linguaggi usano quello che sembra un trucco per fornire lo stesso concetto come C # usando pure classi astratte virtuali. Altri ancora non hanno un concetto di interfaccia e si affidano alla digitazione "duck", ad esempio Ruby. Ruby ha dei moduli, ma quelli sono più sulla falsariga del mescolare i comportamenti a una classe che non per definire come interagire con una classe. In termini OO, le interfacce sono un modo efficace per fornire una separazione tra un client API e un'implementazione API.
Quindi sbrigati e poni la domanda, dal punto di vista dell'esperienza personale:
- La separazione tra intestazione e implementazione ti aiuta a scrivere codice più modulare o ti intralcia? (aiuta a specificare la lingua a cui ti riferisci)
- Il nome rigoroso del nome nello schema del nome della classe di Java aiuta a mantenere la manutenzione, o è una struttura non necessaria a fini di struttura?
- Che cosa proponesti per promuovere una buona separazione API / implementazione e la manutenzione del progetto, come preferiresti farlo?