Loading
Note di Apprendimento
Study Reminders
Support
Text Version

Progettazione Considerazione per la linea di comando

Set your study reminders

We will email you at these times to remind you to study.
  • Monday

    -

    7am

    +

    Tuesday

    -

    7am

    +

    Wednesday

    -

    7am

    +

    Thursday

    -

    7am

    +

    Friday

    -

    7am

    +

    Saturday

    -

    7am

    +

    Sunday

    -

    7am

    +

Ciao a tutti, benvenuti nella terza sessione della prima settimana. Cominciamo con la revisione di quantoabbiamo imparato finora, i temi chiave e poi andiamo a guardare le considerazioni sul design che noiavremo bisogno quando vogliamo implementare la nostra soluzione come applicazione di riga comandi.(Fare Slide Time: 00.43)
L'aspetto chiave di questo corso è l'approccio che viene preso è un approccio incrementale con quellointendiamo partire da qualcosa che sappiamo fare un'applicazione desktop. Egradualmente stepwise lo spingono a potenziarlo e ad estenderlo in modo che alla fine diventi un'applicazione basata su web, ovvero il modo in cui le applicazioni moderne sono tipicamente fatte. Il problema principale che noiuseremo per aiutarci a fare questo è il problema del fair share. La storia alle spalle del problema è diun set di coinquilini che si sottoponono a tante attività come andare a cena o magari al cinema ocomprando alcune cose, e per ogni tale attività qualche coinquilino paga.Alla fine arriva un momento in cui vogliono conciliare tutti i loro pagamenti e debiti. Abbiamoconsiderato una versione semplificata di questo problema, il professor Sane ha già illustrato che doveabbiamo pochi amici come 2 o 3 sottoposti a una serie di attività con il vincolo che per qualsiasi attivitàuno e un solo coinquilino paga. Questa semplice soluzione è stata estesa un po' per pochicoinquilini e abbiamo visto come può essere implementata su un foglio di calcolo.La versione del foglio di calcolo ci aiuta a chiarire le nostre idee di soluzione, in particolare ci aiuta a vedere comela nostra soluzione sia corretta. Il modo in cui lo facciamo è cercare di osservare il comportamento dell'interno del problemache non cambia: il comportamento invariante. E una volta che questo comportamento invariante viene identificatoperché il comportamento non cambia quindi qualunque siano i risultati che si basano su questo comportamentonon cambierà qualunque sia il numero dei coinquilini.Questo ci permette di ragionare sulla correttezza della nostra soluzione: qualcosa che è molto importanteperché stiamo facendo delle cose per noi. Ci sono altri vantaggi di questo approccioanche, ad esempio, ci aiuta a capire gli errori. Se per esempio, l'invariante che calcoliamonon è zero, possiamo subito vedere che c'è qualche problema nel nostro programma e qualcosaè andato storto da qualche parte.Ad esempio, potreste avere avuto un pezzo di input in più o gli importi in ingresso superano il pagamento effettivoper quell' evento, o qualche altro problema, ma qualcosa non va! È molto più facileverificare la correttezza sul nostro programma quando abbiamo qualche invariante nel nostro problema.Il professor Sane ha anche passato un po' di tempo a mostrarci quanto richiesto dalla soluzione. Luiha usato la linea di comando per illustrare i requisiti. Per esempio, avremmo bisogno di avere allemeno 3 modalità di funzionamento la modalità di registrazione, la modalità di spese e una modalitàdi generazione di report.
Siamo andati oltre e ci siamo chiodati di supporre di voler implementare questo su un computer, chevogliamo farne una soluzione basata su computer, che altro dobbiamo pensare? Ebbene, noidobbiamo preoccuparci dei vari tipi di dispositivi di input o più adeguatamente fonti da cui può arrivare l'input. Analogamente, dobbiamo considerare i vari dispositivi di output a cui l'outputpuò essere mostrato o fornito. Invece di prendere tutti i dispositivi di input e tutti i dispositivi di uscita a destrain partenza, è forse molto meglio iniziare con una versione semplificata della soluzione basata su computerin cui selezioniamo solo un dispositivo messo e focus su un solo dispositivo di output.La soluzione basata su fogli di calcolo è andata oltre, perché lo spreadsheet stesso è un'applicazionecome applicazione che si occupa dell'input e della produzione da sola quindi come utenti di foglio di calcoloci concentriamo solo sull'algoritmo di base della nostra soluzione. Infatti, è questo focus che ci permette diosservare direttamente il comportamento invariante nel problema; questo è il valore della soluzione di calcolo. Non solo possiamo osservare ciò che non cambia, l'invariante, ma possiamo anche usarlo percontrollare la nostra soluzione. Questo è quello che abbiamo visto nel foglio di calcolo.(Fare Slide Time: 07.19)
Ora andiamo avanti cercando di provare a pensare a una versione di linea di comando della nostra soluzione.La soluzione di foglio di calcolo ci ha dato una fondazione, in particolare come ci ha permesso di concentrarci sulla componente algoritmicadella soluzione. Ma ora facciamo la nostra soluzione in un vero programma,
cosa potrebbe essere un'applicazione di riga di comando? Per rispondere rapidamente a questo, sta solo costruendo il tuo programmacome eseguibile.Ma cosa è davvero un eseguibile? Una risposta convenzionale a quella è la versione binaria del tuo programma. Perché binario? Poiché la tua macchina, l'hardware, è in realtà in grado di lavorare con solo oggetti binari, ecco perché ogni programma di alto livello in un linguaggio di alto livello deve esseretradotto in un linguaggio di basso livello, il binario e deve essere eseguito. Ed eseguibile faràaccettare i dati per il processo di input e produrre i risultati. In generale, l'eseguibile richiederàqualche fonte di input tramite alcuni meccanismi per l'input che dovremo programmare inl'eseguibile.
Analogamente, richiederà qualche output. Qualunque sia l'output che genera, che l'output generato deveessere messo su dispositivi di output. Per un'applicazione di riga comandi, sistemeremo i nostri dispositivi di input per esserela tastiera e i nostri dispositivi di output come monitor. Questo è molto lungo la direzione cheabbiamo proposto nel nostro corso in cui andiamo incrementando in modo incrementale la nostra soluzione applicativaalla nostra alla fine web-based uno.Proprio ora, stiamo solo iniziando a costruire la nostra versione desktop dell'applicazione e abbiamo sceltoper puntare sulla tastiera come dispositivi di input invece dei tanti dispositivi di input possibili. Analogamente,abbiamo scelto di puntare sul monitor video come dispositivi di output invece di guardare a tutte lepossibili varietà di dispositivi di output. Di solito, la coppia di monitor da tastiera è chiamata come terminale.(Fare Slide Time: 10.34)
Andiamo a progettare il componente di calcolo base della nostra versione di linea di comando del nostro programma. I calcoli di base rimangono gli stessi, ma il relativo verrà implementato come qualche funzioneo un metodo. Funzioni e metodi sono essenzialmente gli stessi è solo che le diverse lingue utilizzanolo stesso termine in modo diverso. Pertanto, qualunque sia la tua lingua preferita si sente libera di usareche mentre ci pensa questo, comunque per quanto riguarda questo corso, utilizzeremo Java.Pertanto, i nostri calcoli di base saranno implementati come qualche metodo di qualche classe, questo metodoaccetterà le informazioni richieste per i calcoli tramite parametri. Le informazioni acquisiteverranno poi elaborate secondo l'algoritmo già discusso. L'outputgenerato verrà restituito indietro.Questo è un buon punto per fermarsi e digredire per una breve nota sulla terminologia. Quello di cui parleremoè input e output versus parametri e valori di ritorno.(Fare Slide Time: 12.20)
Ecco uno schizzo di un tipico sistema informatico: si vede una CPU e una memoria primaria in blu. Sula memoria principale è una qualche area di memoria che sta andando a raccogliere l'input che è statotrasmesso tramite il dispositivo di input. In questo caso la trasmissione di informazioni significa digitare sulla tastierae la tastiera connessa alla macchina; qualunque sia digitato sulla tastiera saràraccolto in qualche posizione di memoria sulla tua RAM.
Sulla memoria primaria abbiamo anche qualche area che ha il metodo che sta per elaborare l'input. Abbiamo inoltre mostrato una certa area riservata ai parametri del metodo e di qualche areariservata al valore di ritorno del metodo. Infine, vediamo anche qualche area della memoria primariariservata alla raccolta dell'output e questa memoria è la connessione con il dispositivo di uscita, inaltre parole qualunque sia in quella memoria viene eventualmente trasmessa al dispositivo di output per la visualizzazione.(Fare Slide Time: 14.05)
Tortiamoci al problema della terminologia. Questa è l'intera foto del nostro sistema informatico.Continuiamo con la terminologia. Ogni qualvolta utilizziamo i nostri dispositivi I/O per trasferire o raccogliere informazionidal computer ci riferiremo a quelle parti come input e output. Così, in particolarequando trasferiamo le informazioni nel computer utilizzando la tastiera che la fase verrà chiamata come input. Da notare che qualunque sia l'input viene raccolto in qualche posizione di memoria che è qualche variabiledel tuo programma. Abbiamo poi superato il valore nella posizione della memoria come parametro tramite un metodocall.
Nota che i valori dei parametri vengono passati. Si possono ricordare varie modalità di passaggio dei valori dei parametri,ad esempio passare per valore, passare per riferimento e molti altri che si possono ricordare. In qualunquemodo vengano passati i parametri, verranno poi elaborati in base a qualunque sia definito inil metodo e dopo l'elaborazione dei valori per l'output vengono generati dal metodo. Quei valorisono restituiti al sistema chiamante, tipicamente vengono raccolti in qualche location di memoriaall'interno del tuo programma.
Da questa posizione di memoria i valori sono ora in uscita sul dispositivo di output. La fase in cuistiamo passando le informazioni dai dispositivi di input al proprio sistema informatico è la fase di input. Ogni qualvoltaraccogliamo le informazioni dal computer e la visualizziamo su un dispositivo di output, chiameremo quellafase come output.Un metodo accetta parametri che vengono passati ad esso e restituisce risultati. Per essere chiari, non saremoa dire che i parametri dei metodi sono input per metodi e metodi generano output. Ora i metodigenerano valori di ritorno che vengono poi trasferiti sui dispositivi di output. L'input e l'output tipicamentesi riferiscono all'interazione del sistema di calcolo con il mondo esterno tramite dispositivi I/O. Al contrario,passanti o restituendoli è sempre all'interno del sistema informatico da un'area di memoria aun'altra area di memoria, ed è questo che i parametri di passaggio e i valori di ritorno ammontano a.Questo è un buon momento per provare a rivedere quanto appreso finora.Abbiamo iniziato a guardare le considerazioni sul design di un'applicazione di riga comandata e durantequel processo abbiamo preso una leggera digressione per avere una chiara revisione sulla terminologia che noiutilizzeremo.
(Riferimento Slide Time: 17.56)
Data la varietà dei sistemi operativi di input e di output solitamente creano un'astrazionechiamata come input standard, che per impostazione predefinita è la tastiera, ma potrebbe essere qualsiasi fonte di datie possiamo richiedere al sistema operativo di modificare il nostro dispositivo di input standard. Analogamente, i sistemi operativitipicamente più sistemi operativi tipicamente consentono di creare un'astrazione di un
dispositivo di output standard che per impostazione predefinita è il monitor, ma potrebbe essere qualsiasi altro dispositivo di uscitaadatto. Il nostro input predefinito è da tastiera e outputs di default al monitor, in altreparole il nostro dispositivo IO predefinito è un terminale.
Sviluppare un'applicazione di riga di comando significa che digitiamo l'applicazione come comando sulla tastierae qualunque siano i risultati di quell' applicazione in questo caso l'app di condivisione equa, i risultatisaranno visibili sul monitor. Ricordiamo ora quale elaborazione è necessaria, in particolare,Professor Sane come già illustrato che ci sono 3 diverse modalità che la nostra applicazione realmentedeve preoccuparsi. Questi sono il numero minimo di modalità e si può, a seconda di cosasi sente giusto, estendere il numero di modalità renderle più affilate.Ma il numero minimo di modalità di cui abbiamo bisogno sono:• una modalità per la registrazione dei tuoi coinquilini• una modalità in cui verrà registrata una determinata spesa per un evento• una modalità in cui verrà generato il report.(Fare Slide Time: 20.03)
Guardiamo a ogni singola modalità un po' più nel dettaglio. Cosa registra ogni coinquilinocoinvolgimento e perché farlo? L'atto di registrazione è richiesto in modo da poter identificare chi assegnare i datidelle spese a. Come si fa? Beh, accettiamo semplicemente i nomi di ogni coinquilino, ecome sarebbe fatto? Esegui un loop fino a quando tutti i coinquilini sono registrati. Si tratta infatti di un approccio semplicistico molto, ma comunque funziona.
(Riferimento Slide Time: 20.53)
Cosa significa registrare una spesa? Come sarebbe stato fatto? Registrare una spesa significherebberaccogliere tutti i dati richiesti per tale particolare dispensa. Almeno due pezzi di informazionisono davvero necessari: accettare il nome del coinquilino che ha effettuato il pagamento,e l'importo effettivo che è stato pagato. Ovviamente, quando si registra una spesa, dobbiamoricordare che in realtà così - e così il coinquilino ha fatto il pagamento.Nella terza fase di generazione del report, il report in realtà è solo un tavolo di tutte le speseche sono state fatte finora dal gruppo. Da quando abbiamo scelto di generare il report alla finedel mese, diremo che questa tabella contiene tutti gli eventi per un determinato mese.Tuttavia, c'è ancora una decisione più progettabile da fare. Generiamo report alla fine diil mese per tutti i membri del gruppo di coinquilini, oppure geniamo report per gli individui?Se geniamo report per tutti allora il singolo report viene appena copiato più volte perogni coinquilino e lui o lei arriva a vedere l'intera spesa che ha pagato chi per quale evento equanto. In contrasto si supponga che il report sia generato per un individuo, poi l'individuo solovede il suo contributo finale richiesto. O possono farsi pagare perché hanno pagatofinora o possono dover pagare perché non hanno pagato per molti eventi.Smetteteci arbitrariamente di riferire su base individuale. Si tratta di un semplice esercizio per estendere taleche la tua applicazione può essere fatta per generare un report completo o generare un report individuale.
Questo è di nuovo un buon momento per mettere in pausa e rivedere di cosa si è parlato.(Fare Slide Time: 23.52)
Per un'applicazione di riga comandi abbiamo scelto di utilizzare la tastiera. Tuttavia, la tastiera è solola fonte di input ci sono due stili in cui gli input possono essere ripresi dai dispositivi di input. Ilprimo è lo stile interattivo; in uno stile interattivo si avvia il comando come un prompt, solo il comandoniente di più. La tua applicazione che ora è un comando del tuo OS inizia a correree ora inizia a chiedersi, ad esempio, quale modalità vuoi operare? Lemodalità possibili sono di registro del corso, record o report.E a seconda di qualunque sia la scelta particolare verrà chiesta le domande successive:
• Se la modalità scelta è &ldé la registrazione allora la domanda successiva potrebbe essere quanti coinquilinici sono. Dopo aver aggiornato il numero di coinquilini, le domande successive saranno il nomedi ogni coinquilino.• Se la modalità scelta è &ld'inizio record, allora il programma della riga di comando chiederà quale evento successivo,chi ha pagato e infine quanto è stato pagato.• Se la modalità scelta è &ld'articolo precedente sarà quindi la prossima domanda,a quale punto l'utente digita il suo nome e ottiene il relativo report.Vediamo che le domande che verranno poste dal comando in applicazione dipenderanno dalla sceltadella domanda che modalità. Tutto questo avviene dopo che il comando ha avviatoin esecuzione.
(Riferimento Slide Time: 26:21)
L'altro stile è uno stile non interattivo di accettare input. In uno stile non interattivo, tutte le informazionirichieste per l'input devono essere prima digitate sulla riga di comando prima dell'avvio dell'applicazione, questa è la differenza chiave tra uno stile di applicazione interattivo e uno stile interattivo non. In uno stile non interattivo, tutte le informazioni richieste devono essere date prima diil programma inizia a eseguire. In uno stile interattivo si raccolgono tipicamente le informazioni dopo che il programmainizia a correre.Dato che in uno stile non interattivo è necessario fornire tutte le informazioni prima che il programmacorra, significa che ora dobbiamo pensare di progettare la sintassi per l'intera linea di comando.Per un sistema interattivo era sufficiente solo il nome del comando, nulla di più erarichiesto sul resto della riga di comando. Per uno stile non interattivo perché dobbiamo fornire informazioniprima che il programma venga eseguito, dobbiamo ora mettere tutte le informazioni richieste sulla riga di comandostessa. Questo significa che dobbiamo progettare e definire una sintassi per la riga di comando.Inoltre, la sintassi deve essere definita per ogni modalità. Ecco la nostra proposta di registrazione, letaggiungi una parola chiave “ reg ”, che è un corto per registrarsi, e l'applicazione della riga di comando sarebbeora look like: fairShare reg <one or more names>Per registrare le spese, creiamo una parola chiave “ exp ” per un breve per le spese e poiil comando sembrerebbe: fairShare exp <name> <amount>
Per la generazione dei report utilizziamo la parola “ rep ” che è un corto per report, il comando avrebbequindi look: fairShare rep <name of roommate>
(Riferimento Slide Time: 29:32)
Osservare che la riga di comando è completamente testuale, cioè tutto è digitato sulla riga di comandoe qualunque sia digitato è solo un mucchio di personaggi, una serie di stringhe, davvero nullain più. Ma questo significa che all'interno del programma dobbiamo convertire queste stringhe che appaiono sulla riga di comandodalla forma testuale a qualunque sia il tipo di dati appropriato di cui abbiamo bisogno.
(Riferimento Slide Time: 30:06)
Ad esempio, qualunque sia la quantità che si digita sulla modalità di gestione delle spese che è solo un set dicaratteri che devono essere convertiti al valore numerico prima di utilizzarlo effettivamente. Tuttavia,dopo una tale conversione avviene allora i dati di input possono essere passati come argomenti a qualsiasi numerodi metodi che eseguono i calcoli richiesti, ma non è possibile semplicemente passare le stringhe.(Fare Slide Time: 30:55)
Come sarebbe l'elaborazione della produzione ora? Ricordiamo che l'output è solo la tabulazione dellafair share per ogni coinquilino. I dati del coinquilino che è il nome di ogni coinquilino sono solo una stringa, i dati di denaro qualunque esso sia dovuto o ricevuto che sia un tipo numerico, tipicamente un vero numeroche in linguaggi come C, C++ o Java lo chiamerebbero come un punto galleggiante. Si tenga presente che i valori numericidevono essere convertiti al loro modulo di stringa prima dell'emissione sullo schermo.Nel nostro caso quando pensiamo ad un terminale, input standard e output standard, dovremmo esserepensando al monitor come ad una superficie di caratteri a 2 dimensioni, in particolare non è grafico. Avedere davvero la differenza, vedere la riga di comando o l'emulatore di terminale sul proprio OS, queste sono le applicazioni della GUIche emulano i terminali.(Fare Slide Time: 32:23)
La conversione di base alla rappresentazione delle stringhe è di solito fornita da funzioni o metodi adattidel tuo linguaggio di programmazione. Le funzioni, ad esempio, che formano l'output sono quelle cheabbiamo usato per convertire i dati alla rappresentazione della stringa. Ad esempio, in Java si potrebbe utilizzaresystem.out.println () o qualsiasi metodo così adatto, ma questi metodi che tipicamentesi convertono alle rappresentazioni delle stringhe sono spesso forniti dalla lingua stessa. Ancora, questo è un buon puntoper fermare e rivedere ciò che è stato fatto.
(Riferimento Slide Time: 33:16)
Ora consideriamo i temi dello stoccaggio; questo non era qualcosa che avevamo pensato davvero afinora. Ma l'idea è che dobbiamo ricordare i risultati calcolati e naturalmente anche i dati di input. Dato che stiamo davvero usando un problema semplificato, possiamo memorizzare queste informazioni in un filesemplice sulla memoria secondaria, ovvero il backend. E potremmo memorizzare il file in modosimile a quello che abbiamo visto nel foglio di calcolo.Ogni riga sarebbe una riga nel file, ogni riga diversa sarà una riga diversa nel file ei valori memorizzati vengono mostrati su una riga il foglio di calcolo quando li mettiamo nel file, euno dei modi più semplici di memorizzarli è separando i valori da virgole. Questo formato ènoto come valori separati da virgola o CSV. In un CSV, ogni riga potrebbe rappresentare un evento con il suo ID evento, i dati di input che sono le spese da parte dei quali per quell' evento, e infine, i calcolidei dati per azione generati come output
(Riferimento Slide Time: 35:06)
Se ci sono gli amici di NRoommate allora le prime colonne NRoommate sono i dati di input perogni amico, e le successive colonne NRoommate sono le informazioni calcolate; questo è moltosimile al foglio di calcolo. Ci sono ovviamente altri metodi per memorizzare i dati ad esempio potremmoutilizzare un sistema di database adatto e potremmo dover eventualmente utilizzarne uno.Ma utilizzeremo un database al back end solo quando necessario fino ad allora utilizziamo file semplici.
(Riferimento Slide Time: 35:45)
Ora portiamo tutte queste cose insieme e cerchiamo di raffigurare pittoricamente la funzionalità diun programma di riga comandi. Solo un rapido recap, la tastiera è l'in uno dei meccanismi di inpute abbiamo scelto che come nostro meccanismo di input, e monitor è una sorta di meccanismo di outpute abbiamo scelto questo. Nelle sessioni successive analizzeremo come gestire altri meccanismi di input e outputcome un'interfaccia grafica utente.(Fare Slide Time: 36:32)
Ma nel frattempo, ecco un diagramma di blocco del design della riga di comando, da sinistra vediamoun input del terminale, lo schema rosso è il limite dell'applicazione della riga di comando e sulla destravediamo un'uscita terminale. All'interno della scatola rossa, la casella delineata, vediamo che dall'input,qualunque siano i dati che arrivano, dobbiamo convertirlo in un tipo di dati appropriato per l'elaborazione. Siviene quindi passato all'effettivo calcolatore di share fair, il metodo che effettivamente calcola la fair sharedi ogni coinquilino e i risultati vengono poi convertiti dal modulo calcolato all'output ail modulo di testo in modo che vada sul terminale.
C'è anche un blocco mostrato per l'archiviazione dei dati sulla memoria secondaria. Da notare che si tratta di un blocco direzionale bi -, la lettura dalla memoria secondaria sta entrando nei calcoli di base
funzione, e qualunque sia il risultato di calcoli o l'input finora acquisito chepuò essere scritto come output allo storage di backend.Ecco come l'applicazione della riga di comando sembrerebbe da una vista piuttosto di alto livello. Ci sono dicorso molti altri dettagli di cui uno deve occuparsi, ma questo formerebbe il tuo secondo incaricoalla fine della prossima settimana.Con che arriviamo alla fine di questa sessione. Grazie, ci vediamo nella prossima sessione.