Disegnare la linea tra stile di codifica e algoritmo [chiuso]

-1

Formattazione con rientri, spazi bianchi e nuove linee ovviamente rientrano nella categoria stile di codifica .

if (a == b) {
    foo();
}

// vs

if (a == b)
{
    foo();
}

D'altro canto, qualcosa che modifica il tempo di esecuzione di un programma non è più una questione di stile di codifica e diventa una questione di algoritmo .

for (var i = 0; i < a.length; i++) {
    // Remove first element of the array.
    a.shift();
}

// vs

for (var i = 0; i < a.length; i++) {
    // Remove last element of the array.
    a.pop();
}

Tuttavia, a che punto uno stile di codifica si trasforma in una questione di algoritmo?

In altre parole, quando si confrontano due possibili metodi per scrivere lo stesso programma, quando possiamo determinare oggettivamente se la scelta tra i due metodi è una preferenza nello stile di codifica o una differenza in algoritmo

Confrontando con true una questione di stile o algoritmo di codifica?

if (a == true) {
    // a is true.
}

// vs

if (a) {
    // a is true.
}

Restituisce true una questione di stile o algoritmo di codifica?

function isA(b) {
    return this.a == b;
}

// vs

function isA(b) {
    if (this.a == b) {
        return true;
    }
    return false;
}

Che ne è delle condizioni di fusione in un'istruzione if ?

if (a > 0) {
    return foo();
}

if (b == 0) {
    return foo();
}

// vs

if (a > 0 || b == 0) {
    return foo();
}

Condizioni del ciclo?

// Loop 10 times.
for (var i = 0; i < 10; i++);

// vs

// Loop 10 times.
for (var i = 1; i <= 10; i++);

Nested if statement?

function foobar() {
    if (a) {
        return foo();
    }

    if (b) {
        return bar();
    }

    return barfoo();
}

// vs

function foobar() {
    if (a) {
        return foo();
    } else {
        if (b) {
            return bar();
        } else {
            return barfoo();
        }
    }
}

Questi esempi non cambiano esattamente il tempo di esecuzione di un programma, ma non sono esattamente solo indentazioni, spazi bianchi o nuove modifiche di linea. Di solito non sono menzionati nelle guide di stile di codifica per la maggior parte delle lingue.

Dati questi esempi sopra e altri esempi simili, è la differenza uno stile di codifica o algoritmo ? O c'è un termine completamente diverso per questo?

Ad esempio, se io sono qualcuno che usa for (var i = 0; i < 10; i++) , ho semplicemente una preferenza diversa per lo stile di codifica rispetto a qualcuno che usa for (var i = 1; i <= 10; i++) ? O c'è qualcosa di più oltre allo stile di codifica solo ? A che punto non è più solo lo stile di codifica e inizia a diventare parte dell'algoritmo?

    
posta Zsw 24.10.2015 - 23:07
fonte

1 risposta

4

Risposta breve:

Le due versioni del codice sono in grado di produrre risultati diversi quando vengono eseguite ? Se è così, probabilmente sono algoritmi diversi.

Il tipo di risultati di cui ci occupiamo:

  • Risultati dell'esecuzione. Ad esempio, shift e pop modificano l'array in modi diversi, quindi il contenuto dell'array è diverso. Qualsiasi altro codice che abbia accesso all'array deve essere consapevole di come è stato inteso essere modificato.

  • Differenze di qualità o "requisiti non funzionali" . Ad esempio, se il tempo impiegato dall'operazione "cresce linearmente (proporzionale) alla dimensione corrente dell'array", la sua prestazione è diversa da un'altra che "cresce in modo quadratico a (proporzionale al quadrato di) la dimensione corrente dell'array" , quindi è probabile che i due codici implementino due algoritmi diversi.

  • Ci sono molti altri risultati a cui potremmo essere interessati, a seconda della natura dei progetti software.

Risposta più lunga:

Per essere in grado di capire se alcune modifiche al codice determineranno una modifica dell'algoritmo, è necessario:

  • Ragione logicamente. Articolo: algebra booleana .
  • Comprendi le regole della lingua molto bene.
  • Avere un modello mentale semplificato su come il codice dovrebbe essere eseguito, passo dopo passo, da un computer (o un programma per computer / macchina virtuale).
  • Comprendi i possibili modi in cui il compilatore o il programma di esecuzione possono discostarsi dal tuo modello mentale semplificato.
risposta data 25.10.2015 - 00:50
fonte

Leggi altre domande sui tag