Non credo di credere più nel principio KISS. Prima di tutto, sono stati sopravvalutati ...
Considera questa funzione
void process_payment(payment const& p) {
account * a = get_account();
if (!a) {
std::cout << "No account information.\n";
return;
}
...
}
È semplicissimo. Se seguiamo il principio KISS, potremmo fare qualcosa di simile. La funzione NON è semplice da testare poiché ora dobbiamo reindirizzare l'output standard a qualcosa che i test possono elaborare. Puoi risolvere questo problema aggiungendo complessità all'interfaccia della funzione prendendo l'handle di output come parametro. Non è così semplice come si può fare e mi sono imbattuto in aderenti a KISS che sono davvero fuori di testa per cose come questa ... specialmente se stanno combattendo con i loro superiori sul fatto che i test unitari dovrebbero essere fatti.
Inoltre, ciò che è "semplice" è negli occhi di chi guarda. Proprio l'altro giorno ho preso delle cagate per usare un oggetto buffer che cresce come necessario piuttosto che malloc + memset + memcpy per copiare una stringa passata a me da un'API di rete. Secondo me l'uso di un oggetto buffer è più semplice perché è già lì, fa quello di cui ho bisogno (anche se farà di più), ecc ... Secondo l'opinione dell'altro, farlo manualmente è più semplice perché il buffer è eccessivo. Ovviamente ha ragione perché è il capo.
Ancora di più, di fronte alla decisione di utilizzare una variabile globale per consentire l'accesso da parte di molte funzioni e di far passare questa variabile come parametro, è abbastanza ovvio che la prima è molto più "semplice". È anche piuttosto ovvio che nella maggior parte dei casi è una cattiva scelta. I seguaci di KISS scelgono il primo e il loro codice si trasforma in questo nodo di spaghetti non sperimentato che non è nemmeno possibile concettualizzare poiché la modularità e il disaccoppiamento sono tutti usciti dalla finestra nel tentativo di mantenere le cose "semplici" ... e sì, con una misura ovvia e possibilmente ingenua di semplice è molto più semplice raggiungere e afferrare il tocco globale piuttosto che chiamare una funzione esistente solo per nascondere questo globale o aggirare un parametro.
Considera anche questo codice:
void somethingAboutStrings(char* in) {
char buffer[128];
strcpy(buffer, in);
...
}
Molto semplice, quello. Ho visto che troppi aderenti al KISS scrivono un codice C simile a quello, compreso quello che attualmente sto martellando su tutto ciò che faccio come "complicato". Si assumono così tanto e diventano più semplici di quanto sia sicuro. Chiunque conosca la lingua sa che la funzione di cui sopra è incredibilmente insicura e un giorno porterà a bug che richiedono ore e ore per risolverlo. È un codice come il precedente che dà davvero nomi C e C ++ e l'industria è piena di merda come questa, dalle applicazioni di base al settore finanziario e ad altri ... è terrificante per me. Ma questo è "semplice" e perché dovresti scrivere un sacco di codice di rilevamento degli errori e di protezione del buffer quando sai che l'input sarà sempre più corto di X?
La risposta a questa domanda è ovviamente che qualcuno non saprà che hai questo limite di dimensioni interno e arbitrario e lo supererà ... o che qualche errore finirà sulla linea - che è quello che è successo.
Dopo aver preso cagate per gli ultimi 8 mesi da questo aderente al KISS, sono diventato piuttosto cinico dell'idea e penso che probabilmente porti a più problemi che a prenderli. Scrivere codice riutilizzabile è una buona cosa. Scrivere codice testato è una buona cosa. Il disaccoppiamento è MOLTO buono ... e direi che alla fine rendono le cose più facili da gestire, più facili da leggere, ecc. Non sono, per quanto "semplici"; almeno non nel modo in cui ho visto quella parola usata di recente.