Il software più intelligente è necessariamente più grande? [chiuso]

5

Questa è una specie di domanda vaga, quindi mi scuso in anticipo.

Quando il software è "più intelligente", tendo a interpretarlo come se dicessi semplicemente che copre più casi limite. Prima di tutto, è corretto?

Supponendo che lo sia, vuol dire che il software è pieno di istruzioni if / switch per assicurarsi che l'input sia gestito correttamente, rendendolo quindi "più intelligente"?

Questo modo di pensare mi fa sentire come se il codice finisse gonfio e disordinato. Mi sto imbattendo in un punto in cui voglio gestire questi casi limite, ma non voglio gonfiare il mio codice semplicemente trascurando alcune best practice. Cosa mi manca?

    
posta farinasa 11.10.2013 - 19:45
fonte

5 risposte

4

When software is "smarter", I tend to interpret that as really just saying that it covers more edge cases. First of all, is this correct?

A volte sì. Generalmente, non così tanto.

Considera un correttore ortografico. Un correttore ortografico più "intelligente" potrebbe includere suggerimenti per la correzione. Potrebbe essere ancora più intelligente rilevare errori di digitazione mediante lettere trasposte fisicamente chiuse su una tastiera. Questi non controllano alcun caso extra edge, fanno più lavoro per fornire risultati migliori.

Assuming it is, does this mean that the software is full of if/switch statements to make sure input is handled properly, therefore making it "smarter"?

Molto raramente. Più spesso viene utilizzato un algoritmo diverso che risolve le varianti "più difficili" del problema o almeno fornisce risultati migliori a scapito di problemi "facili" o tramite consumo di tempo / risorse.

I'm running into a point where I'm wanting to handle these edge cases, but I don't want to bloat my code merely overlooking some best practice.

A volte i casi limite richiedono questo tipo di logica condizionale, ma spesso possono essere gestiti tramite una soluzione più generale o una visione più generale dei dati.

Non è una garanzia che una soluzione per A e B sia necessariamente meno complessa di una soluzione per A , B e C .

    
risposta data 11.10.2013 - 20:08
fonte
6

I would have written a shorter letter, but I did not have the time.
~ Blaise Pascal

Il software più intelligente è non necessariamente più grande, ma nella maggior parte dei casi lo è.

Nel migliore dei casi, un software più intelligente non ti consente semplicemente di seguire un percorso di errore. Controllando quali condizioni possono verificarsi, il numero totale di casi da codificare può essere ridotto.

Ad esempio, tre flag A , B , C fornisce fino a 8 permutazioni. Se hai solo bisogno di 3 di quelle 8 permutazioni e il software impedisce agli altri 5 di essere selezionati, allora hai scritto meno codice. Quindi l'applicazione più intelligente può essere più piccola.

Ma i casi limite continuano a crescere e può essere difficile controllare le permutazioni associate a quei casi limite. Quindi l'applicazione richiede più controlli condizionali e codice percorso errore. In tal caso, più significa più grande.

Ho aperto la mia risposta con la frase di Pascal perché cattura davvero l'enigma che le vostre domande presentano. Se viene data l'ora, avrai meno codice fornendo più funzionalità. Ma ciò richiede o implica anche una solida comprensione del problema e la capacità di trovare una soluzione eloquente. Spesso, non riusciamo a creare la soluzione eloquente e il nostro codebase di applicazioni aumenta di conseguenza proporzionalmente una quantità maggiore.

    
risposta data 11.10.2013 - 21:05
fonte
1

Se il design è simile allora sì sarà più grande. No, non dovrebbe essere gonfio e disordinato.

Scopri come gestire i casi limite con garbo. I contratti e la programmazione orientata all'aspetto sono due idee che potresti trovare interessanti. Oltre a quella organizzazione del codice più intelligente può aiutare. Piccole funzioni che controllano solo le condizioni del bordo e possono essere riutilizzate in più punti possono aiutare a ridurre il disordine. Organizzate il vostro codice come precondizione, lavoro, postcondizione? Trovo che mi aiuti a mantenere le cose in ordine.

Assicurati anche che i tuoi casi limite debbano essere gestiti. Le poche ipotesi che il tuo codice verifica è più flessibile quando le cose cambiano. Una funzione dovrebbe solo controllare le cose di cui ha bisogno per portare a termine il lavoro, a meno che non si tratti di codice "border guard" che deve effettuare la convalida dell'input dell'utente.

    
risposta data 11.10.2013 - 20:07
fonte
1

Come menzionato da FrustratedWithFormsDesigner, più probabilmente che no, la copertura dei casi limite non produce software errato o soggetto a errori. Per non parlare dei rischi per la sicurezza causati da una cattiva gestione dei casi limite (ad es. Buffer overflow, sql injection, ecc.).

L'intelligenza del software dipende dalla tua definizione, può riferirsi a software in grado di apprendere macchina, può anche riferirsi a software che gestisce gli ingressi e l'ampli; errori con grazia e fa il miglio supplementare facendo un favore all'utente finale. Ad esempio, suggerendo collegamenti relativi alla query di ricerca quando non restituisce risultati. Completamento automatico con i termini suggeriti, ecc ...

Ora, rendere la tua applicazione "più intelligente" non lo rende necessariamente gonfio o più grande. Un algoritmo efficiente e ben scritto può probabilmente far sì che il tuo codice non sia gonfiato, per non parlare del fatto che la maggior parte delle volte ci sono già librerie e framework preesistenti che ti aiutano a fare le basi senza sovraccaricare il tuo codice.

Ad esempio, quando si ha a che fare con la sanitizzazione dell'input da parte dell'utente, invece di creare un blocco di switch case o un blocco if else di grandi dimensioni, un programmatore di ruby on rails può semplicemente utilizzare convalida i metodi di supporto . Questo riduce drasticamente la quantità di codice necessaria per eseguire le convalide dei moduli, senza contare che rende più semplice il tuo lavoro.

Nella programmazione, c'è sempre più di un modo per fare le cose, quindi se pensi che quello che stai facendo è far gonfiare il tuo codebase, fai un passo indietro e riesamina il tuo codice, forse puoi codificarlo meglio per mantenere il bloat a un minimo.

    
risposta data 11.10.2013 - 20:05
fonte
-1

No! Un software più intelligente può semplificare il modo in cui un problema viene affrontato e risolto, lasciando meno "casi limite". Meno può essere di più.

    
risposta data 11.10.2013 - 20:20
fonte

Leggi altre domande sui tag