Domanda

Sono un po 'stordito da un sacco di reazioni su questioni che indicano che gli sviluppatori preoccupa di più i byte compilati risultanti di circa il significato del loro codice. Io tendo a pignoli su incremento postfix / prefisso, come tendo a pignoli su come utilizzare un valore booleano per un tipo enumerato con due valori, e circa il corretto funzionamento di denominazione, e ...

Quindi, la questione è più un sondaggio retorica: quando è un permesso di ignorare la semantica di ciò che si scrive? Dov'è la linea di confine?

  • operator ++ (postfix / prefisso)
  • String.Empty () vs. stringa == ""
  • vector.empty () vs. vector.size () == 0
  • enumerare {on, off} contro booleana sui = true; off = false
  • ...

Nome esso.

Modifica -

Non volevo mettere in dubbio circa la necessità di (micro) -Ottimizzazioni. Piuttosto, voglio pareri su quanto bene si dovrebbe essere consapevoli di quello che si sta scrivendo, e sulle dichiarazioni del tipo "ma si compila per un valore DWORD, in ogni caso, quindi perché dovrei farlo un enum?" (Questo è un caso estremo ...).

È stato utile?

Soluzione

Ho scritto un molto di codice nella mia carriera. Certamente non tanto quanto molte persone qui, ma un sacco di codice comunque. Durante questo tempo, ho imparato una cosa che si è rivelata vera e più volte:. Quando si arriva sciatta, quando si ignorano i dettagli, difetti insinuarsi

Difetti costano tempo e denaro per la riparazione. È possibile trascorrere il tempo di scrivere il codice in modo pulito e chiaro in anticipo, quando è a buon mercato per farlo, oppure si può spendere un sacco di tempo e denaro in seguito inseguire un difetto nel codice che probabilmente non ti ricordi di tutto ciò che bene perché si schiaffeggiato insieme in fretta o perché non è conforme allo standard di codifica. Il risultato finale è, stai sprecando tempo e denaro. Inoltre, stai sprecando tempo e denaro, non c'era bisogno di sprecare per cominciare, perché avrebbe potuto essere impedito da un po 'di anticipo investimenti.

mi sono mai pentito di essere meticoloso circa il mio modo di scrivere codice. Non è mai ritorcersi contro di me. Essere sciatta ha sempre ritorcersi contro di me.

Altri suggerimenti

Definisci "ok". Va bene se funziona alla data di consegna iniziale, ma ogni volta che si ha bisogno di fare un cambiamento ci vuole un extra di tre settimane per capire il vecchio codice?

Non c'è la risposta: fino a quando si può capire il codice e non fa male la vostra capacità di mantenere

.

Quando si inizia a preoccuparsi di cose esoteriche che non hanno alcun effetto sulla linea di fondo, penso che sta andando troppo lontano. Le discussioni come se utilizzare l'operatore ternario o scrivere esplicito se le dichiarazioni sono buoni per quei giorni in cui non hai niente da fare che sedersi, mettere i piedi, birra SIP / vino / soda e discutere questioni di "grande importanza":)

Ma la creazione di un'enumerazione per booleana è semplicemente sbagliato.

dipende dalla vostra funzione di costo

Ecco un paio di dimensioni gente ama discutere, e spesso confondono. In realtà, la risposta è dipende. Che cosa è che veramente valore?

  • Numero caratteri
  • Numero di ops creati
  • Run-time
  • Portabilità
  • Maintainability
  • Clarity
  • Cleverness
  • Stabilità (esenti da bug?)
  • Estensibilità

Ho sempre puntare al roba ordine superiore prima, come la chiarezza. Perdita di chiarezza è pagato in cicli umani, di cui c'è sempre una carenza di. Le persone raramente si preoccupano ora dell'orologio prime, e le persone che dicono di sono quasi sempre ottimizzando prematuramente.

Se si aiuta qualsiasi, mi piace pensare che stiamo facendo progressi andando lo stack, la cura di più la semantica e il lavoro sempre fatto piuttosto che essere schiavi di bit e numeri. Tuttavia, questa non è una scusa per dimenticare i fondamenti e ricordare come alcuni bit semantici applicazione. Se non si desidera ottenere catturati con i pantaloni giù durante quelle rare occasioni in cui la velocità inizia alla materia e convenzione va fuori dalla finestra.

"quando è un permesso di ignorare la semantica di ciò che si scrive? Dov'è la linea di confine?"

Credo che una domanda ragionevole è: "Quando dovrebbe un disprezzo la semantica di ciò che si scrive"

Dal momento che ho vista di programmazione come attività umana, direi che l'unica volta che uno dovrebbe ignorare la semantica di una dichiarazione è quando il sistema stesso si obbliga - quando qualche dichiarazione incomprensibile è il solo modo per fare qualcosa. Tali dichiarazioni sono buone per documentare.

Il confine è quando si tratta di write-once, read-mai codice. Solo allora in ultima analisi, non importa quello che stai facendo (in quel caso), perché non si sarà mai usare di nuovo. Purtroppo, questo non affronta le valutazioni indiretta di praticare cose che si preferisce non ripetere.

La linea di confine è effetti collaterali.

Se una funzione incapsulata fa tutto quello che volete con 0 inaspettati effetti collaterali, e il codice è leggibile, questo è tutto quello che conta. Se sei prevedibile a un utente esterno e qualsiasi funzionalità "bizzarra" si svolge internamente, questo è tutto quello che conta.

Si cambia leggermente se si aggiunge in ottimizzazione, ma dal momento che non si dovrebbe mai prematuramente ottimizzare, che è dove finisce.

ottimizzazioni Micro sono inutili il 99% del tempo. Ad esempio, se i tirocinanti compilatore tutti "" per una singola istanza in ogni modo, non si è in aumento le prestazioni in alcun modo, utilizzando String.Empty. Non avendo alcun effetto misurabile è in genere il meglio che si possa sperare troppo, ho visto "ottimizzazioni" prestazioni diminuzione, a causa del compilatore facendo un lavoro migliore, e l'ottimizzazione interferire con esso.

La maggior parte del codice non ha bisogno di essere ottimizzato. Identificare dove che deve accadere può essere fatto solo con diagnosi dopo che il codice è in esecuzione, e anche allora la maggior parte del tempo si è fatto attraverso l'ottimizzazione algoritmica, non micro ottimizzazione.

Credo che in questi giorni la maggior parte delle persone concordano sul fatto che, ammesso che funziona correttamente, la leggibilità è la considerazione più importante. Ci sono eccezioni, naturalmente - alcune applicazioni devono correre il più velocemente possibile, e alcune applicazioni possono non essere consentito di crash, ma in generale si tratta di leggibilità

.

Osservando gli esempi che ci avete fornito - Il seguente:

operator++ (suffisso / prefisso)

string.empty() vs string == ""

Non sembrano essere buoni esempi, come si confronta operazioni che sono diverse in functionality. Quindi, uno migliore non ignorare le distinzioni semantiche.

Al contrario, i seguenti esempi:

vector.empty() vs vector.size() == 0

enum {rano on, off} vs. boolean on=true; off=false

Sono perfettamente ragionevole.

indeterminate è preferibile se il contesto del suo uso è solo per determinare se il vettore è vuoto. A rischio suona condiscendente (cosa che faccio non intenzione di essere): questo si riduce al senso comune. Perché chiedere per la dimensione del vettore se desideri solo sapere se è vuota? E 'come chiedere a qualcuno quanti soldi hanno in loro portafogli quando semplicemente si desidera sapere se hanno abbastanza denaro per per una Coca.

Per quanto riguarda <=> rano {<=>, <=>} vs. <=> <=>; <=>, porsi questa: quanto è probabile che si può aggiungere un altro valore al enumerazione, in futuro? Sembra ragionevole che uno potrebbe desiderare <=> rano {<=>, <=>, <=>} `(o qualche variazione), quindi la risposta potrebbe essere sì. In caso contrario, un semplice booleano sarebbe sufficiente.

Questo mi porta al nocciolo della tua domanda: che sembra essere se c'è qualche approccio deterministico / algoritmico di decidere in un modo o nell'altro su questioni come queste, o la loro rilevanza? La mia risposta è che fino al giorno che macchine di Turing sono in grado di passare il test di Turing , direi No. Questo è il motivo per cui gli esseri umani sono tenuti a progettare il software.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top