Você está na página 1de 32

Natureza do Software e dos

Sistemas
Jorge H C Fernandes

Natureza do Software e dos Sistemas, por Jorge H C Fernandes


Diferença Fundamental entre
Engenharia de Software e outras
Engenharias!
• Os materiais são diferentes
• As teorias fundamentais são diferentes

Natureza do Software e dos Sistemas, por Jorge H C Fernandes


Dificuldades
de engenharia de Software
• Porque é dificil entenderem o que fazemos
quando desenvolvendo software?
– Não há entendimento da diferença entre
software e sistema!
• Porque é difícil separarmos o software do
sistema?
– Porque o software afeta (profundamente) e
depende do sistema no qual é utilizado

Natureza do Software e dos Sistemas, por Jorge H C Fernandes


// cria o tratador de evento para o botão "2"
public class Calc { import java.awt.*;
button_2.addActionListener(new
private int estadoInteracao;import java.awt.event.*;
java.awt.event.ActionListener() {
private int operacaoSelecionada;
private long acumulador0; // Cria os painéis Software
public class CalcVisual extends Frame {

private long acumulador1; Panel panelTeclas = new Panel();


public void actionPerformed(ActionEvent
button_2_actionPerformed(e);
private static final int NENHUMA
Panel panelTeclasTopo
= 0; button_9.setLabel("9");
= new Panel();
}
private static final int SOMAPanel
= 1;panelTeclasNumericas = new button_soma.setLabel("+");
Panel();
private static final int SUBTRACAO = 2; });
button_igual.setLabel("=");
private static final int ACUMULANDO_0
// cria os gerenciadores
= 0; de layout dos painéis // cria o tratador de evento para o botão "+"
private static final int ACUMULANDO_1
BorderLayout BorderLayoutPrincipal
= 1; = new BorderLayout();
button_soma.addActionListener(new
public Calc() {} // adiciona
BorderLayout BorderLayoutTodasAsTeclas alguns
= new botões();no painel de teclas superior
BorderLayout
long soma() { GridLayout gridLayoutClearCEBackSpace = new GridLayout ();java.awt.event.ActionListener() {
gridLayoutClearCEBackSpace.setColumns(3);
operacaoSelecionada = SOMA;GridLayout gridLayoutTeclasNumericasEOperacoes = new GridLayout(); public void actionPerformed(ActionEvent
estadoInteracao = ACUMULANDO_1; panelTeclasTopo.setLayout(gridLayoutClearCEBackSpace);
button_soma_actionPerformed(e);
return acumulador0; panelTeclasTopo.add(buttonBackspace, null);
// cria a área de display da calculadora
} TextField textFieldDisplay = new TextField(); }
panelTeclasTopo.add(buttonCE, null);
long um() {return numeroDigitado(1);} });
// cria os botões da calculadora panelTeclasTopo.add(buttonC,
long dois() {return numeroDigitado(2);} null);
// cria o tratador de evento para o botão "-"
long numeroDigitado(int valor)
Button{ buttonBackspace = new Button();
if (estadoInteracao == ACUMULANDO_0)
Button buttonC = new { Button(); button_subtracao.addActionListener(new
// adiciona alguns botões no painel de teclas inferior {
java.awt.event.ActionListener()
acumulador0 = acumulador0Button* 10
buttonCE
+ valor; = new Button();
Button button_0 = new Button(); gridLayoutTeclasNumericasEOperacoes.setRows(4);
estadoInteracao = ACUMULANDO_0; public void actionPerformed(ActionEvent
return acumulador0; Button button_1 = new Button(); gridLayoutTeclasNumericasEOperacoes.setColumns(5);
button_subtracao_actionPerformed(e);
} else if (estadoInteracao ==
Button
ACUMULANDO_1)
button_2 = new Button();
{
acumulador1 = acumulador1Button* 10button_3
+ valor;= new Button();
gridLayoutTeclasNumericasEOperacoes.setHgap(4);
}
Button button_4 = new Button(); gridLayoutTeclasNumericasEOperacoes.setVgap(4);
estadoInteracao = ACUMULANDO_1; });
return acumulador1; Button button_5 = new Button();
// cria o tratador de evento para o botão "*"
} Button button_6 = new Button(); panelTeclasNumericas.setLayout(gridLayoutTeclasNumericasEOpe
return 0; Button button_7 = new Button(); racoes); button_mult.addActionListener(new
} Button button_8 = new Button(); java.awt.event.ActionListener() {
long igual() { Button button_9 = new Button(); panelTeclasNumericas.add(button_7, null);
public void actionPerformed(ActionEvent
long resultado = 0; Button button_pontoDecimal = new panelTeclasNumericas.add(button_8,
Button(); null);
if (operacaoSelecionada == Button
SOMA) button_igual
{
button_mult_actionPerformed(e);
Natureza do= Software
new Button();
panelTeclasNumericas.add(button_9,
e dos Sistemas, por Jorge H C Fernandes null);
resultado = acumulador0Button
+ acumulador1;
button_soma = new Button(); }
panelTeclasNumericas.add(button_divisao, null);
Software
• Conjunto organizado de instruções e
descrições de dados
• Escrito em uma (ou mais) linguagens
compreensíveis por um sistema de
computação

Natureza do Software e dos Sistemas, por Jorge H C Fernandes


Sistema
• um conjunto de elementos inter-relacionados que interagem no desempenho de
uma função
• Sistema econômico
– mantém os recursos da economia em circulação
• Sistema Computacional
– atende a uma determinada necessidade de processamento de informações de
usuários
• Sistema Solar
– Manter os planetas girando em torno do sol
• Sistema de injeção eletrônica
– regular a mistura ótima de combustível e ar para o funcionamento do motor
• Sistema digestivo
– incorporar, ao corpo de um animal, a energia e matéria contidas em alimentos
• Biosfera
– manter a vida sobre a terra

Natureza do Software e dos Sistemas, por Jorge H C Fernandes


Um Sistema De Computador é
uma Máquina
• O Usuário Conversa com a Máquina

Sistema de
Computador
(Estendido Saída
Pelo Software) (output)

Entrada
(input)

Usuário

Natureza do Software e dos Sistemas, por Jorge H C Fernandes


Uma Máquina de Calcular

Natureza do Software e dos Sistemas, por Jorge H C Fernandes


Uma Máquina para Analisar
Programas Java

Natureza do Software e dos Sistemas, por Jorge H C Fernandes


Um Sistema para Desenhar ou
Máquina de Desenhar

Natureza do Software e dos Sistemas, por Jorge H C Fernandes


Um Sistema ou Máquina para
Tratar Imagens

Natureza do Software e dos Sistemas, por Jorge H C Fernandes


Um Sistema ou Máquina,
que Simula um Celular,
que simula um jogo de damas

Natureza do Software e dos Sistemas, por Jorge H C Fernandes


Várias Máquinas Coexistem em um
Sistema de Computador em um Mesmo
Instante de Tempo

Natureza do Software e dos Sistemas, por Jorge H C Fernandes


Um Sistema de Computador
Programável é uma Fábrica de
Máquinas Extensível
E cada software descreve
como fábricar uma máquina
E o programador constrói estas
descrições de máquinas conforme
especificações do que a máquina deve
fazer quando em funcionamento
Natureza do Software e dos Sistemas, por Jorge H C Fernandes
O uso da Máquina é feito por
uma Conversa, que é Baseada
uma Linguagem
Linguagem A
(Conversar com Celular)

Linguagem B
(Conversar com Paint)

Linguagem C
(Conversar com Calculadora)

Natureza do Software e dos Sistemas, por Jorge H C Fernandes


A Linguagem da “Máquina”
Paint

Natureza do Software e dos Sistemas, por Jorge H C Fernandes


A Linguagem da “Máquina”
Calculadora

Natureza do Software e dos Sistemas, por Jorge H C Fernandes


Vamos conversar com Algumas
Máquinas?
• Converse com o Paint
• Converse com o GIMP
• Converse com o Powerpoint!
• Converse com o sistema operacional

Natureza do Software e dos Sistemas, por Jorge H C Fernandes


No que consiste o conversar?
• Num diálogo com a máquina
• Na locução de frases que são construídas
numa linguagem com sintaxe e semântica
próprias

Natureza do Software e dos Sistemas, por Jorge H C Fernandes


Quando uma máquina faz
sucesso?
• Quando a conversa entre usuário e máquina
é produtiva
• Quando do diálogo são produzidos
resultados que satisfazem as necessidades
do usuário

Natureza do Software e dos Sistemas, por Jorge H C Fernandes


Máquinas Complexas e
Hierarquizadas

Natureza do Software e dos Sistemas, por Jorge H C Fernandes


Usuário

Uso

Máquina n+1

Interpretação do Software

Software Carga Máquinan

Natureza do Software e dos Sistemas, por Jorge H C Fernandes


Um Sistema Computacional Usual
Máquina n (MCSW)

Software em Execução

Interpretação
...
Máquina 2 (MCSW)
Uso
Software em Execução

Interpretação
Software Carga Máquina 1 (MCSW)
... Uso
Software em Execução
Software Carga
Interpretação
Máquina 0
Software Carga
MPU Uso

Natureza do Software e dos Sistemas, por Jorge H C Fernandes


input Echo
output (machine)

usuário Interpretation
Loading
echo.txt
(software) Loader vc0
input
(machine) (machine)
output
Interpretation
Loader.class
(software) input JVM – Java Virtual Machine
output (machine)

java.exe Interpretation
(software) input cmd Loading
(machine) Sistema Operacional
output
(machine)
Natureza do Software e dos Sistemas, por Jorge H C Fernandes
Uma Máquina explorer criada
pelo sistema operacional

input
Usuário do output
Explorer

explorer.exe Read
explorer
(software) (machine)
Interpretation

input cmd Loading


Usuário do (machine) Sistema Operacional
Sistema Operacional output
(machine)
Natureza do Software e dos Sistemas, por Jorge H C Fernandes
public class Calc { import java.awt.*; // cria o tratador de evento para o botão "2"
import java.awt.event.*;

private int estadoInteracao; public class CalcVisual extends Frame { button_2.addActionListener(new java.awt.event.ActionListener() {
// Cria os painéis
Panel panelTeclas = new Panel(); public void actionPerformed (ActionEvent e) {
private int operacaoSelecionada ; Panel panelTeclasTopo = new Panel();
Panel panelTeclasNumericas = new Panel();
button_2_actionPerformed (e);
private long acumulador0; }
// cria os gerenciadores de layout dos painéis
private long acumulador1; BorderLayout BorderLayoutPrincipal = new BorderLayout(); });
private static final int NENHUMA = 0; BorderLayout BorderLayoutTodasAsTeclas = new BorderLayout(); // cria o tratador de evento para o botão "+"
GridLayout gridLayoutClearCEBackSpace = new GridLayout();
GridLayout gridLayoutTeclasNumericasEOperacoes = new GridLayout(); button_soma.addActionListener(new java.awt.event.ActionListener() {
private static final int SOMA = 1;
// cria a área de display da calculadora public void actionPerformed (ActionEvent e) {
private static final int SUBTRACAO = 2; TextField textFieldDisplay = new TextField(); button_soma_ actionPerformed (e);
private static final int ACUMULANDO_0 = 0; // cria os botões da calculadora }
private static final int ACUMULANDO_1 = 1; Button buttonBackspace = newButton(); button_9.setLabel("9"); });
Button buttonC = new Button();

public Calc () {} Button buttonCE= new Button(); button_soma.setLabel ("+"); // cria o tratador de evento para o botão "-"
Button button_0 = new Button();
Button button_1 = new Button(); button_igual.setLabel("="); button_subtracao.addActionListener(new java.awt.event.ActionListener() {
long soma() { Button button_2 = new Button();
Button button_3 = new Button(); public void actionPerformed (ActionEvent e) {
operacaoSelecionada = SOMA; Button button_4 = new Button(); // adiciona alguns botões no painel de teclas superior button_subtracao _actionPerformed (e);
Button button_5 = new Button();
estadoInteracao = ACUMULANDO_1; Button button_6 = new Button(); gridLayoutClearCEBackSpace.setColumns (3); }
return acumulador0; Button button_7 = new Button(); panelTeclasTopo.setLayout(gridLayoutClearCEBackSpace); });
Button button_8 = new Button();
Button button_9 = new Button(); panelTeclasTopo.add(buttonBackspace, null); // cria o tratador de evento para o botão "*"
} Button button_pontoDecimal = new Button();
Button button_igual = new Button(); panelTeclasTopo.add(buttonCE, null); button_mult.addActionListener(new java.awt.event.ActionListener() {
long um() { return numeroDigitado(1);} Button button_soma = new Button(); panelTeclasTopo.add(buttonC, null); public void actionPerformed (ActionEvent e) {
Button button_subtracao = new Button();
long dois() {return numeroDigitado(2);} Button button_mult = new Button( ) ; button_mult_actionPerformed (e);
Button button_divisao = new Button();
long numeroDigitado(int valor) { Button button_percento = new Button();
// adiciona alguns botões no painel de teclas inferior }
if (estadoInteracao == ACUMULANDO_0) { Button button_raiz = new Button(); gridLayoutTeclasNumericasEOperacoes.setRows (4); });
Button button_inverteSinal = new Button();
Button button_reciproco = new Button(); gridLayoutTeclasNumericasEOperacoes.setColumns (5); // cria o tratador de evento para o botão "/"
acumulador0 = acumulador0 * 10 + valor;
// cria o "modelo de dados", isto é, o próprio objeto calculadora gridLayoutTeclasNumericasEOperacoes.setHgap (4); button_divisao .addActionListener(new java.awt.event.ActionListener() {
estadoInteracao = ACUMULANDO_0; gridLayoutTeclasNumericasEOperacoes.setVgap (4);
// que irá efetivamente realizar os cálculos
Calc calc = new Calc();
public void actionPerformed (ActionEvent e) {
return acumulador0; panelTeclasNumericas.setLayout(gridLayoutTeclasNumericasEOperacoes); button_divisao_actionPerformed (e);
} else if (estadoInteracao == ACUMULANDO_1) // construtor da parte visual da calculadora
public CalcVisual() {
panelTeclasNumericas.add(button_7, null ); }
{ try { panelTeclasNumericas.add(button_8, null ); });
buildGUI();
acumulador1 = acumulador1 * 10 + valor; } catch (Exception e) { panelTeclasNumericas.add(button_9, null ); // cria o tratador de evento para o botão "="
e.printStackTrace( ) ;
panelTeclasNumericas.add(button_divisao, null ); button_igual.addActionListener(new java.awt.event.ActionListener() {
estadoInteracao = ACUMULANDO_1; }
} panelTeclasNumericas.add(button_raiz, null); public void actionPerformed (ActionEvent e) {
return acumulador1; /**
panelTeclasNumericas.add(button_4, null );
* Constroi os elementos da interface grafica da calculadora button_igual_ actionPerformed (e);
} */ panelTeclasNumericas.add(button_5, null ); }
private void buildGUI() throws Exception {
return 0; panelTeclasNumericas.add(button_6, null ); });
// ajusta as propriedades display
} textFieldDisplay.setText("0"); panelTeclasNumericas.add(button_mult, null); // cria o tratador de evento para o comando de janelas windowclose
panelTeclasNumericas.add(button_percento , null); // (ALT+F4 no windows)
long igual() { // modifica cores de alguns botões

Você Usa ou Testa Software?


buttonBackspace.setForeground(Color.red); panelTeclasNumericas.add(button_1, null ); this .addWindowListener(new java.awt.event.WindowAdapter() {
long resultado = 0; buttonC.setForeground(Color.red);
panelTeclasNumericas.add(button_2, null );
buttonCE.setForeground(Color.red ); public void windowClosing (WindowEvent e) {
if (operacaoSelecionada == SOMA) { panelTeclasNumericas.add(button_3, null ); this_windowClosing(e);
// atribui rótulos aos botões da calculadora
resultado = acumulador0 + acumulador1; buttonC.setLabel("C"); panelTeclasNumericas.add(button_subtracao , null); }
buttonCE.setLabel("CE");
} buttonBackspace.setLabel(" Backspace"); panelTeclasNumericas.add(button_reciproco, null); });
button_0.setLabel("0"); panelTeclasNumericas.add(button_0, null ); // mostra a interface grafica para o usuário
reset(); button_1.setLabel("1");
button_2.setLabel("2"); panelTeclasNumericas.add(button_inverteSinal, null); show();
return resultado; button_3.setLabel("3");
panelTeclasNumericas.add(button_pontoDecimal, null);
button_4.setLabel("4"); }
} button_5.setLabel("5"); panelTeclasNumericas.add(button_soma, null); // métodos que implementam o tratamento de eventos
button_6.setLabel("6");
long reset() { button_7.setLabel("7"); panelTeclasNumericas.add(button_igual, null ); void this_windowClosing (WindowEvent e) {
button_8.setLabel("8");
estadoInteracao = ACUMULANDO_0; System.exit(0);
// adiciona ao painel geral de todas as teclas }
operacaoSelecionada = NENHUMA; // os dois paineis de teclas menores void button_soma_ actionPerformed (ActionEvent e) {
acumulador0 = 0; // ajusta as propriedades dos gerenciadores de layout this .textFieldDisplay .setText("" + calc.soma());
acumulador1 = 0; panelTeclas.setLayout(BorderLayoutTodasAsTeclas ); }
return acumulador0; panelTeclas.add(panelTeclasTopo , BorderLayout.NORTH); void button_subtracao_actionPerformed (ActionEvent e) {
panelTeclas.add(panelTeclasNumericas, BorderLayout.CENTER); this .textFieldDisplay .setText("" + calc.sub());
}
}
} // ajusta propriedades gerais visuais da interface void button_mult_actionPerformed (ActionEvent e) {
this .setSize(250, 275); this .textFieldDisplay .setText("" + calc.mult());
this .setResizable(false); }
this .setLayout(BorderLayoutPrincipal); void button_divisao _actionPerformed (ActionEvent e) {
// adiciona o painel geral de teclas ao centro frame (this) this .textFieldDisplay .setText("" + calc.div());
this .add(panelTeclas, BorderLayout .CENTER); }
// adiciona o display ao topo do frame (this) void button_igual_actionPerformed (ActionEvent e) {
this .add(textFieldDisplay , BorderLayout.NORTH); this .textFieldDisplay .setText("" + calc.igual());
}
/** void button_1_actionPerformed (ActionEvent e) {
* cria os vários tratadores de evento this .textFieldDisplay .setText("" + calc.um());
*/ }
// cria o tratador de evento para o botão C (clear) void button_2_actionPerformed (ActionEvent e) {
buttonC .addActionListener(new java.awt.event.ActionListener() { this .textFieldDisplay .setText("" + calc.dois());
public void actionPerformed (ActionEvent e) { }
buttonC_actionPerformed (e); void buttonC _actionPerformed (ActionEvent e) {
} this .textFieldDisplay .setText("" + calc.reset());
}); }
// cria o tratador de evento para o botão "1" public static void main (String[] args) {
button_1.addActionListener(new java.awt.event.ActionListener() { CalcVisual CalcVisual1 = new CalcVisual();
public void actionPerformed (ActionEvent e) { }
button_1_actionPerformed (e); }
Natureza do Software e dos Sistemas, por Jorge H C Fernandes
}
});
Usuário Final
Uso
Usuários e máquinas Máquina
intermediadora Usuário
Uso Uso
Máquina n+1
Softwaren em Execução
Uso
Interpretação
.... Máquina n
Software n Carga ....
....
Máquina 2
Software 2 Carga
Software1 em Execução Uso
u
Interpretação
Máquina 1
Software 1 Carga
Software0 em Execução
Interpretação Uso
Máquina0
Software 0 Carga Hardware

Natureza do Software e dos Sistemas, por Jorge H C Fernandes


Hierarquia de Máquinas e Linguagens
6 - Interpretação De ED2?

Usuário 2? Saída de Dados (Processo P2?)


7 - Entrada de Dados 2 – ED2? (Possível execução de ED1,
(sentença escrita em linguagem Reconhece ED2 escrita em L2?)
L2, criada pelo Usuário 1?)
6 - Interpretação de ED1
Usuário 1
5- Entrada de Dados 1 – ED1 Processo P1
(sentença escrita em linguagem (Resulta da Execução de ED0,
L1, criada pelo programador.) Reconhece ED1 escrita em L1)

2 – Solicita Carga do Programa P0 4 - Interpretação de ED0

Programa 3 – Entrada de Dados 0 – ED0


P0, Máquina Computável M0
(ED0 é uma cópia do programa P0)
Armazenado (Reconhecedor de ED0)

1 - Programa P0, sentença escrita em uma linguagem computável L0

Programador

Natureza do Software e dos Sistemas, por Jorge H C Fernandes


Tríade da Prática do Software
cliente

Linguagem
máquina
desejada Problemas e
Restrições Necessidades
Descrição
De tempo e
Construtiva de Máquina possuída
custo
máquina

Satisfação final
desenvolvedor usuário

Natureza do Software e dos Sistemas, por Jorge H C Fernandes


Evolução Histórica do Software
cliente
cliente
Linguagem
Linguagem
máquina
Problemas e máquina
desejada Problemas e
Restrições Necessidades desejada
Descrição Restrições Necessidades
De tempo e Máquina possuída Descrição
Construtiva de De tempo e Máquina possuída
custo Construtiva de
máquina custo
máquina

Satisfação final
Satisfação final
desenvolvedor usuário desenvolvedor usuário

Tempo 0 Tempo 1
Novos problemas e necessidades
A linguagem da máquina desejada é expandida
Novas descrições são construídas, sobre as antigas

Natureza do Software e dos Sistemas, por Jorge H C Fernandes


É Engenharia de Software?
Ou Engenharia de Software e
Sistemas?

Natureza do Software e dos Sistemas, por Jorge H C Fernandes


Natureza do Software e dos
Sistemas
Jorge H C Fernandes

Natureza do Software e dos Sistemas, por Jorge H C Fernandes