Loading
Nota de Estudos
Study Reminders
Support
Text Version

Consideração De Design Para Linha De 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

    +

Olá a todos, bem-vindos à terceira sessão da primeira semana. Comecemos por revisar o queaprendemos até agora, os principais problemas e depois seguir analisando as considerações de design que nósprecisaremos quando queremos implementar nossa solução como um aplicativo de linha de comandos.(Consulte o Tempo de Slide: 00:43)
O aspecto chave deste curso é a abordagem que é tomada é uma abordagem incremental por meio dissoqueremos dizer que começaríamos a partir de algo que sabemos como fazer um aplicativo de desktop. Egradualmente o stepwise vai em aprimorá-lo e estendê-lo para que eventualmente ele se torne um aplicativobaseado na web, que é a forma como os aplicativos modernos são tipicamente feitos. O principal problema que nósvamos usar para nos ajudar a fazer isso é o problema de partilha justa. A história por trás do problema é sobreum conjunto de colegas de quarto que passam por muitas atividades como ir jantar ou talvez filmes oucomprando algumas coisas, e para cada uma dessas atividades alguns colegas de quarto pagam.Eventualmente chega um momento em que eles querem conciliar todos os seus pagamentos e dívidas. Temosconsiderada uma versão simplificada desse problema, o Professor Sane já ilustrou que em quetemos alguns amigos como 2 ou 3 passando por um conjunto de atividades com a restrição que para qualquer atividadeuma e apenas uma colega de quarto paga. Esta solução simples foi estendida um pouco para algunscolegas de quarto, e vimos como ele pode ser implementado em uma planilha.A versão da planilha ajuda-nos a esclarecer nossas ideias de solução, em particular nos ajuda a ver comonossa solução está correta. A forma como fazemos isso é tentar observar comportamentos do dentro do problemaque não se altera: o comportamento invariante. E uma vez que este comportamento invariante é identificadoporque o comportamento não muda portanto quaisquer que sejam os resultados baseados neste comportamentonão mudará o que quer que seja o número de colegas de quarto.Isso nos permite raciocinarmos sobre a correção da nossa solução: algo que é muito importanteporque estamos fazendo uma máquina fazer coisas para nós. Há outras vantagens dessa abordagemtambém, por exemplo, ela nos ajuda a descobrir erros. Se por exemplo, o invariante que calculamosnão é zero, podemos imediatamente ver que há algum problema em nosso programa e algodeu errado em algum lugar.Por exemplo, você pode ter tido uma peça extra ou as quantias de entrada excederem o pagamento realpara aquele evento, ou alguma outra questão, mas algo não está certo! É muito mais fácil paraverificar a correção sobre o nosso programa quando temos algum invariante em nosso problema.O professor Sane também já passou algum tempo nos mostrando o que é exigido fora da solução. Eletem usado linha de comando para ilustrar os requisitos. Por exemplo, precisaríamos ter emmenos 3 modos de operação o modo de registro, o modo de despesas e um modo de geração de relatórios.
Nós fomos mais longe e nos perguntamos supor que queremos implementar isso em um computador, queé queremos fazer disso uma solução baseada em computadores, o que mais precisamos pensar? Bem, nósprecisamos nos preocupar com os vários tipos de dispositivos de entrada ou mais apropriadamente fontes a partir da qual a entradapode vir. Da mesma forma, temos que considerar os vários dispositivos de saída para os quais a saídapode ser mostrada ou fornecida. Em vez de pegar todos os dispositivos de entrada e todos os dispositivos de saída acertadosna largada, talvez seja muito melhor começar com uma versão simplificada da solução computadorizadaonde acabamos de pegar um dispositivo colocado e focar em um dispositivo de saída.A solução baseada em planilha foi um passo a mais, pois a própria planilha é um aplicativocomo um aplicativo ele cuida da entrada e saída por si só como usuários da planilhanós apenas focamos no algoritmo básico da nossa solução. Na verdade, é esse foco que nos permiteobservar diretamente o comportamento invariante no problema; que é o valor da solução de planilha. Não só podemos observar o que não está mudando, o invariante, mas também podemos utilizá-lo paraverificar nossa solução. É o que vimos na planilha.(Consulte o Slide Time: 07:19)
Vamos agora adiante tentando ao tentar pensar sobre uma versão de linha de comando de nossa solução.A solução de planilha nos deu uma base, particularmente como nos permitiu focar no componente algorítmicoda solução. Mas deixemos agora a nossa solução em um verdadeiro programa,
o que poderia ser um aplicativo de linha de comando? Para responder rapidamente a isso, é só construir o seu programacomo um executável.Mas o que realmente é um executável? Uma resposta convencional para isso é a versão binária do seu programa. Por que binário? Como sua máquina, o hardware, é realmente capaz de trabalhar com objetos bináriosapenas, é por isso que todo alto nível todo programa em uma linguagem de alto nível tem que sertraduzido para uma linguagem de baixo nível, o binário, e ele tem que ser executado. E executável iráaceitar dados para o processo de entrada it, e produzir os resultados. Em geral, o executável exigiráalguma fonte de entrada através de alguns mecanismos para entrada que teremos de ser programados emo executável.
Da mesma forma, ele exigirá alguma saída. Qualquer que seja a saída que ela gera, que a saída gerada tem queser colocada em dispositivos de saída. Para um aplicativo de linha de comandos, vamos corrigir nossos dispositivos de entrada para sero teclado e os nossos dispositivos de saída como o monitor. Isso é muito ao longo da direção quenós propusemos em nosso curso onde incrementamos gradativamente a mudança de nossa solução de aplicativospara o nosso eventualmente baseado na web.Nesse momento, estamos apenas começando a construir nossa versão desktop do aplicativo e escolhemospara focar no teclado como os dispositivos de entrada em vez dos muitos dispositivos de entrada possíveis. Da mesma forma,optamos por focar no monitor de vídeo como os dispositivos de saída em vez de olhar para toda apossível variedade de dispositivos de saída. Geralmente, o par de teclados do teclado é chamado como um terminal.(Consulte o Tempo de Slide: 10:34)
Vamos chegar ao design do componente de cálculo básico da nossa versão de linha de comando do nosso programa. Os cálculos básicos permanecem os mesmos, mas o ele será implementado como alguma funçãoou um método. Funções e métodos são essencialmente os mesmos é apenas que línguas diferentes usamo mesmo termo de uma maneira diferente. Portanto, seja qual for o seu idioma favorito sinta-se à vontade para usarque enquanto pensar sobre isso, no entanto, no que diz respeito a este curso, estaremos usando Java.Portanto, nossos cálculos básicos serão implementados como algum método de alguma classe, este métodoaceitará as informações necessárias para cálculos via parâmetros. As informações adquiridasserão, então, processadas de acordo com o algoritmo que foi discutido já. A saída geradaserá devolvida em volta.Este é um bom ponto para parar e divagar por uma nota rápida sobre terminologia. O que falaremossobre é entrada e saída versus parâmetros e valores de retorno.(Consulte o Tempo de Slide: 12:20)
Aqui está um esboço de um sistema de computador típico: você vê uma CPU e uma memória primária em azul. Noa memória primária é alguma área de memória que vai coletar a entrada que foitransmitida através do dispositivo de entrada. Neste caso transmissão de informações significa digitar o tecladoe o teclado conectado à máquina; o que for digitado no teclado serácoletado em algum local de memória em sua RAM.
Na memória primária também temos alguma área que tem o método que vai processar a entrada. Mostramos também alguma área reservada para parâmetros do método e de alguma áreareservada para o valor de retorno do método. Por fim, também vemos alguma área da memória primáriareservada para coleta da saída e esta memória é a conexão com o dispositivo de saída, emoutras palavras seja o que estiver naquela memória é eventualmente transmitida para o dispositivo de saída para exibição.(Consulte o Tempo de Slide: 14:05)
Vamos voltar para o problema da terminologia. Esta é toda a imagem do nosso sistema informático.Vamos continuar com a terminologia. Sempre que utilizamos nossos dispositivos de E/S para transferir ou coletar informaçõesa partir do computador nos referiremos a essas partes como entrada e saída. Assim, em especialquando transferimos informações para o computador usando o teclado essa fase será chamada como entrada. Note que o que quer que seja entrada é coletado em algum local de memória que é alguma variáveldo seu programa. Passamos, então, o valor no local da memória como parâmetro via uma chamada de método.
Observe que os valores de parâmetros são passados. Você pode relembrar várias formas de passar valores de parâmetro,por exemplo passar por valor, passar por referência, e muitas outras que você pode relembrar. Em qualquer queforma os parâmetros sejam passados, eles serão então processados de acordo com o que for definido emo método, e após o processamento os valores para saída são gerados pelo método. Esses valoressão retornados de volta para o sistema de chamada, geralmente eles são coletados em algum local de memóriadentro do seu programa.
A partir deste local de memória os valores passam a ser de saída no dispositivo de saída. A fase em queestamos passando informações de dispositivos de entrada para o seu sistema de computador é fase de entrada. Sempre quecoletamos informações do computador e exibem-lo em um dispositivo de saída, chamaremos que a fasecomo saída.Um método aceita parâmetros que são passados para ele e retorna resultados. Para ser claro, não iremosdizer que os parâmetros de métodos são entrada para métodos e métodos geram saída. Agora os métodosgeram valores de retorno que são então transferidos para os dispositivos de saída. Entrada e saída tipicamentereferem-se à interação do sistema de computação com o mundo exterior via dispositivos de E/S. Em contraste,passar valores ou devolvê-los está sempre dentro do sistema de computador de uma área de memória paraoutra área de memória, e é isso que passar parâmetros e devolver valores equivale a.Este é um bom momento para tentar revisar o que foi aprendido até agora.Começamos a olhar para as considerações de design de um aplicativo de linha de comandos e duranteesse processo nós pegamos uma leve digressão para ter uma revisão clara sobre a terminologia que nósusaremos.
(Consulte O Tempo De Deslizamento: 17:56)
Dada a variedade de sistemas operacionais de entrada e saída os sistemas de operação geralmente criam uma abstraçãochamada como uma entrada padrão, que por padrão é o teclado, mas pode ser qualquer fonte de dadose podemos solicitar o sistema operacional para alterar nosso dispositivo de entrada padrão. Da mesma forma, os sistemas operacionaisgeralmente a maioria dos sistemas operacionais geralmente permitem criar uma abstração de um
dispositivo de saída padrão que por padrão é o monitor, mas poderia ser qualquer outro dispositivo de saídaadequado. Nossa entrada padrão é da corrida de saídas de teclado e padrão para o monitor, em outraspalavras nosso dispositivo IO padrão é um terminal.
Desenvolver um aplicativo de linha de comandos significa que digitamos o aplicativo como um comando no tecladoe quaisquer que sejam os resultados dessa aplicação neste caso o app de compartilhamento justo, os resultadosserão visíveis no monitor. Lembremos agora de que processamento é necessário, em particular,Professor Sane como já ilustrado que existem 3 modos diferentes que a nossa aplicação realmenteprecisa se preocupar. Estes são o número mínimo de modos e você pode, dependendo do quevocê sentir está certo, estender o número de modos torná-los sharper.Mas o número mínimo de modos que precisamos são:• um modo para o registro de seus colegas de quarto• um modo no qual um determinado gasto para um evento será gravado• um modo no qual o relatório será gerado.(Consulte o Tempo do slide: 20:03)
Deixe-nos olhar para cada modos individuais um pouco mais em detalhes. O que registra cada colega de quartoenvolve e por que fazer? O ato de registro é necessário para que possamos identificar a quem atribuir os dadosdas despesas. Como fazemos isso? Bem, simplesmente aceitamos os nomes de cada colega de quarto, ecomo isso seria feito? Execute um loop até que todos os colegas de quarto estejam registrados. Esta é de fato uma abordagem simplista muito, mas, mesmo assim, funciona.
(Consulte O Tempo De Deslizamento: 20:53)
O que significa gravar um gasto? Como é que isso seria feito? Gravar um gasto iriasignificar a coleta de todos os dados que são necessários para aquele gasto específico. Pelo menos duas peças de informaçõessão realmente necessárias: aceitar o nome do companheiro de quarto que fez o pagamento,e a quantia real que foi paga. É claro que, ao gravar um gasto, precisamoslembrar que o tão novato na verdade fez o pagamento.Na terceira fase de geração da reportagem, o relatório na verdade é apenas uma tabela de todas as despesasque foram feitas até agora pelo grupo. Já que optamos por gerar o relatório no finaldo mês, vamos dizer que esta tabela contém todos os eventos para um determinado mês.No entanto, ainda há mais uma decisão de design a ser feita. Nós geramos relatório no final deo mês para todos os membros do grupo de colegas de quarto, ou geramos relatório paraindivíduos?Se geramos relatório para todos eles então o relatório único é apenas copiado várias vezes paracada colega de quarto e ele ou ela passa a ver as despesas que pagaram a quem para que evento equanto. Em contraste suponhamos que o relatório seja gerado para um indivíduo, então o indivíduo apenasvê sua ou sua contribuição final necessária. Ou eles podem ser pagos porque passaram a pagaraté agora ou podem ter que pagar porque não pagaram por muitos eventos.Vamos arbitrariamente decidir reportando sobre uma base individual. É um simples exercício para estender esse talque o seu aplicativo pode ser feito para gerar um relatório completo ou gerar um relatório individual.
Este é novamente um bom momento para pausar e revisar o que foi falado.(Consulte o Slide Time: 23:52)
Para um aplicativo de linha de comandos optamos por utilizar o teclado. No entanto, o teclado é apenasa fonte de entrada há dois estilos em que entradas podem ser tomadas a partir de dispositivos de entrada. Oprimeiro é estilo interativo; em um estilo interativo você inicia o comando como um prompt, apenas o comandonada mais. Seu aplicativo que agora é um comando de seu SO começa a ser executadoe agora ele começa a fazer pergunta, por exemplo, qual modo você quer operar? Osmodos possíveis são de registro de curso, registro ou relatório.E dependendo de quem for a escolha particular as perguntas subsequentes serão feitas:
• Se o modo escolhido for ‘ registrando ’ então a próxima pergunta poderia ser quantas colegas de quartoestão lá. Após a atualização do número de colegas de quarto, as perguntas subsequentes serão nomede cada roommate.• Se o modo escolhido for ‘ registro ’, então o programa da linha de comando perguntará qual evento próximo,que pagou e finalmente quanto foi pago.• Se o modo escolhido for ‘ report ’ então a próxima pergunta será cujo relatório é necessário,em que ponto o usuário digitará o seu nome e obterá o relatório correspondente.Vemos que as perguntas que serão feitas pelo comando em aplicação dependerão da escolhada questão que modo. Tudo isso está acontecendo depois que o comando começourodando.
(Consulte O Tempo De Deslizamento: 26:21)
O outro estilo é um estilo não interativo de aceitação de insumos. Em um estilo não interagindo, todas as informaçõesnecessárias para entrada devem ser digitadas primeiramente na linha de comando antes do início do aplicativo, esta é a diferença chave entre um estilo de aplicativo interativo e um estilo interativo diferente de. Em um estilo não interativo, todas as informações que são necessárias devem ser dadas antes deo programa começar a executar. Em um estilo interativo você geralmente coleta as informações depois que o programacomeça a ser executado.Dado que em um estilo não interativo precisamos fornecer todas as informações antes que o programaseja executado, significa que devemos agora pensar em projetar a sintaxe para toda a linha de comandos.Para um sistema interativo apenas o nome do comando era suficiente, nada mais eranecessário no restante da linha de comando. Para um estilo não interativo porque precisamos fornecer informaçõesantes que o programa seja executado, devemos agora colocar todas as informações necessárias na própria linha de comando. Isso significa que precisamos projetar e definir uma sintaxe para a linha de comando.Além disso, a sintaxe deve ser definida para cada modo. Aqui está a nossa proposta de registro, letus add a palavra-chave “ reg ”, que é um short para cadastro, e o aplicativo da linha de comandos seriaagora parecido com: fairShare reg <one or more names>A fim de registrar as despesas, vamos criar uma palavra-chave “ exp ” para um short para despesas, e entãoo comando pareceria como: fairShare exp <name> <amount>
Para geração de relatórios deixe-nos usar a palavra “ rep ” que é um short para report, o comando ficariaentão parecido com: fairShare rep <name of roommate>
(Consulte O Tempo De Deslizamento: 29:32)
Observe que a linha de comandos é completamente baseada em texto, ou seja, tudo é digitado na linha de comandoe o que for digitado é apenas um monte de caracteres, um conjunto de strings, realmente nadamais. Mas isso significa que dentro do programa devemos converter essas strings que aparecem na linha de comandoda forma textual para qualquer que seja o tipo de dado adequado que precisamos.
(Consulte O Tempo De Deslizamento: 30:06)
Por exemplo, seja qual for a quantidade que você digitar sobre o modo de operação de despesas que é apenas um conjunto decaracteres que precisam ser convertidos para o valor numérico antes de nós realmente utilizá-lo. No entanto,após uma tal conversão ser feita então os dados de entrada podem ser passados como argumentos para qualquer númerode métodos que executam os cálculos necessários, mas não é possível simplesmente passar as strings.(Consulte o Tempo do slide: 30:55)
Como o processamento de saída agora se pareceria? Lembre-se de que a saída é apenas a tabulação da parte justa dopara cada colega de quarto. Os dados de roommate que é o nome de cada colega de quarto é apenas uma string, o dinheiro dados o que quer que seja devido ou recebido que é um tipo numérico, tipicamente um número realque em linguagens como C, C++ ou Java chamaria como ponto flutuante. Note que os valores numéricosdevem ser convertidos para o seu formulário string antes da saída na tela.Em nosso caso quando estamos pensando em um terminal, entrada padrão e saída padrão, devemos serpensando no monitor como uma área de 2 dimensões de caracteres, em particular não é gráfica. Paraver realmente a diferença, ver linha de comando ou emulador de terminal em seu SO, estes são aplicativos GUIque emitam terminais.(Consulte o Tempo do slide: 32:23)
A conversão básica para a representação string é geralmente fornecida por funções ou métodos adequadosde sua linguagem de programação. Funções, por exemplo, que formatar a saída são aquelas queutilizamos para converter os dados para a representação string. Por exemplo, em Java você pode estar usandosystem.out.println () ou qualquer método tão adequado, mas esses métodos que tipicamenteconvertem para as representações das cordas são muitas vezes fornecidos pela própria linguagem. Novamente, este é umbom ponto para parar e revisar o que foi feito.
(Consulte O Tempo De Deslizamento: 33:16)
Deixe-nos considerar agora as questões de armazenamento; isso não foi algo que realmente tínhamos pensado sobreaté agora. Mas a ideia é que precisamos lembrar os resultados calculados e claro também os dados de entrada. Dado que estamos realmente usando um problema simplificado, podemos armazenar essas informações em um arquivo simplesno armazenamento secundário, que é o backend. E poderíamos armazenar o arquivo de maneirasemelhante ao que vimos na planilha.Cada linha seria uma linha no arquivo, cada linha diferente será uma linha diferente no arquivo, eos valores que são armazenados são mostrados em uma linha a planilha quando os colocamos no arquivo, euma das formas mais simples de armazená-los é separando os valores por vírgulas. Este formato éconhecido como comma separada valores ou CSV. Em um CSV, cada linha poderia representar um evento com seu ID de evento, os dados de entrada que são as despesas por quem para aquele evento e, finalmente, os cálculosdos dados por compartilhar que são gerados como a saída
(Consulte O Tempo De Deslizamento: 35:06)
Se houver amigos NRoommates então as primeiras colunas de NRoommates são os dados de entrada paracada amigo, e as próximas colunas NRoommates são as informações calculadas; esta é muitosemelhante à planilha. Existem naturalmente outros métodos para armazenar dados por exemplo poderíamosusar um sistema de banco de dados adequado e podemos ter que eventualmente usar um.Mas usaremos um banco de dados na parte de trás somente quando necessário até então deixemos usar arquivos simples.
(Consulte O Tempo De Deslizamento: 35:45)
Vamos agora trazer todas essas coisas juntas e tentar pictorialmente retratar a funcionalidade deum programa de linha de comandos. Basta um recapitinho rápido, o teclado é o em um dos mecanismos de entradae nós escolhemos isso como nosso mecanismo de entrada, e monitor é um tipo de mecanismo de saídae nós escolhemos isso. Em sessões posteriores vamos observar como lidar com outros mecanismos de entrada e saídacomo uma interface gráfica do usuário.(Consulte o Tempo do slide: 36:32)
Mas, no entretanto, aqui está um diagrama de blocos do design da linha de comando, a partir da esquerda vemosuma entrada de terminal, o esboço vermelho é o limite do aplicativo da linha de comandos, e nadireita, vemos uma saída terminal. Dentro da caixa vermelha, a caixa delineada, vemos que a partir da entrada,qualquer que seja os dados que vem, precisamos convertê-lo para o tipo de dado adequado para processamento. Eleé então passado para a calculadora de compartilhamento real real, o método que realmente computa a parcela justade cada roommate, e os resultados são então convertidos do formulário calculado para a saída parao formulário de texto para que ele vá para o terminal.
Há também um bloco mostrado para armazenamento de dados na memória secundária. Observe que este é um bloco direcional bi-, a leitura da memória secundária está entrando nos cálculos básicos
função, e qualquer que seja o resultado de cálculos ou a entrada que foi até agora adquirida quepode ser escrita como a saída para o armazenamento backend.É assim que a aplicação da linha de comando olharia de uma visão razoavelmente de alto nível. Há decurso muitos mais detalhes que um precisa cuidar, mas isso formaria sua segunda tarefaeventualmente na próxima semana.Com isso chegamos ao final desta sessão. Obrigado, veja você na próxima sessão.