Qual è un linguaggio appropriato per esprimere le fasi iniziali del raffinamento dell'algoritmo? [chiuso]

-1

In primo luogo, questo non è un compito a casa, ma puoi trattarlo come tale;). Ho trovato la seguente domanda nel documento pubblicato Il cammello ha due gobbe . Non ero uno specialista di CS che frequentava il college (mi sono laureato in MIS / Management), ma ho un lavoro in cui mi ritrovo a scrivere codice abbastanza spesso.

For a non-trivial programming problem, which one of the following is an appropriate language for expressing the initial stages of algorithm refinement?

(a) A high-level programming language.

(b) English.

(c) Byte code.

(d) The native machine code for the processor on which the program will run.

(e) Structured English (pseudocode).

Quello che so è che di solito vuoi iniziare la tua implementazione di design scrivendo pseuducode e poi spostando / scrivendo nella tecnologia desiderata (perché lo facciamo tutti, giusto?) Ma io non ho mai ci pensò in termini di perfezionamento . Voglio dire, se tu fossi il designer originale, allora potresti avere accesso allo pseudocodice originale. Ma realisticamente, quando devo mantenere / refactare / ridefinire il codice di qualcun altro, continuo a viaggiare con il linguaggio in cui attualmente risiede. Qualcuno ha una risposta definitiva a questo?

Come nota a margine, ho fatto una rapida scansione del foglio perché non ho letto ogni singolo dettaglio. Presenta varie statistiche sul punteggio, non è possibile trovare dove siano le risposte con il foglio.

    
posta Chad Harrison 04.09.2012 - 22:44
fonte

3 risposte

2

Non c'è una risposta definitiva, tranne che pochissime persone sceglierebbero C o D. La mia preferenza è A, ma altri potrebbero preferire B o E.

I moderni linguaggi di alto livello sono abbastanza espressivi da non preoccuparmi dello pseudo-codice. Invece di scrivere pseudo-codice che dice "ottieni dati, fai qualcosa di complicato, pubblica qualcosa", posso solo scrivere codice

def main
    def myData = getSomeDataSomehow()
    def result = myData.doSomethingComplicated()
    result.outputSomewhere()
end

Più probabile, inizierò con un test:

def testThatNoDataProducesNoOutput
    createNullData()
    runCode()
    checkForEmptyOutput()
end

Quindi aggiungo successivamente test ed elabora il codice fino a quando non riesco a pensare a ulteriori test.

    
risposta data 04.09.2012 - 23:15
fonte
0

Prima di tutto, credo che nessuno abbia una risposta definitiva .

Personalmente sono sempre infastidito da ogni tipo di pseudocodice anche nei buoni libri, anche in quelli eccellenti, che si tratti della Bibbia di Knuth Bibbia "o Corman" Vangelo ".

Sono pronto ad apprendere e ad apprendere qualsiasi linguaggio reale, non c'è alcun problema a leggere l'implementazione dell'algoritmo scritto su qualsiasi linguaggio di alto livello. Inoltre, ho trovato tali frammenti di codice più utili in qualsiasi senso.

Per quanto riguarda il raffinamento, beh, il mio primo pensiero è stato notare che in realtà sì, ci sono alcune opzioni, che possono essere coniugate con quel termine. Perché, occuparsi di memoria, allocazione manuale e deallocazione, ci può distogliere dall'essenza stessa dell'algoritmo. Per ragioni simili, le lingue dinamicamente tipizzate sono più preferibili rispetto a quelle statiche. Approssimativamente, Java è migliore per il cosiddetto algorithm refinement di С ++ e Ruby o Python sono migliori di Java.

Dire questo, ripeto, era la mia prima intenzione. Ma poi mi sono ricordato che in realtà non ho problemi con la lettura di frammenti di codice in Haskell (che conosco un po '), ML (che non conosco affatto) o C ++, che non ho mai usato.

Quindi, credo che sia solo questione di pratica. Chiunque stia leggendo molte spiegazioni sugli algoritmi deve imparare a individuare rapidamente diverse peculiarità delle diverse lingue. Per quanto mi riguarda, è molto meglio quando quelle lingue sono "reali".

ps  hai dimenticato di menzionare i diagrammi di flusso)))

    
risposta data 04.09.2012 - 23:11
fonte
0

La risposta che stanno cercando è l'inglese. Più precisamente, il linguaggio utilizzato dovrebbe essere quello compreso dal minimo comune denominatore (solitamente gli utenti finali del sistema e / o la persona che paga i conti).

L'inferenza che gli utenti finali e altri "soggetti interessati" non tecnici sono qui coinvolti rende la risposta ovvia; "le fasi iniziali del raffinamento dell'algoritmo" è sinonimo di "raccolta dei requisiti dell'algoritmo". Tali requisiti non sono raccolti in bytecode, codice macchina, C # o persino pseudocodice; sono raccolti in inglese e gli utenti valuteranno la correttezza dell'algoritmo in termini di ciò che hanno detto che dovrebbe fare, in inglese.

Una volta che i requisiti sono stati raccolti in inglese semplice, sono in genere strutturati in un formato "Given ... When ... Then ...". "Dato che l'utente ha lasciato vuoto il campo ID utente, quando l'utente fa clic sul pulsante" Accedi ", quindi il programma visualizza un messaggio di errore e evidenzia il campo ID utente". Questi sono ancora molto comprensibili dagli utenti finali e sono pseudocodice non . Questi possono essere presi, uno alla volta, e usati per produrre un algoritmo pseudocodice che può essere rivisto prima di essere sviluppato nella lingua nativa. A seconda dell'ambiente, lo pseudocodice potrebbe non essere necessario (o addirittura incoraggiato; in genere TDD dovrebbe iniziare a codificare un test in base a ciascun requisito Given / When / Then e quindi codificare per passare a turno ciascun test mantenendo tutti i test precedenti. "verde"), ma lo pseudocodice è un buon modo per strutturare il layout di un algoritmo complesso e farlo rivedere da solo o da qualsiasi altro membro del team, indipendentemente dal livello di esperienza che tu o qualcuno di loro possa avere con il linguaggio di programmazione essere usato.

    
risposta data 04.09.2012 - 23:28
fonte

Leggi altre domande sui tag