Você está na página 1de 30

Programação
em
Java
para
a
Plataforma
Android
–
AULA
19


Fatores
de
Qualidade
de

So?ware

•  Fatores
de
qualidade
de
So?ware

•  Fatores
de
qualidade
externos
e
internos

•  AnC‐fatores
de
qualidade

•  A
rigidez
dificultando
mudanças

•  A
imobilidade
dificultando
reúso

•  Soluções
simplistas
dificultando
a
manutenção.

Qualidade
de
So?ware

•  Existem
dois
Cpos
de
qualidade
de
so?ware.

–  Um
Cpo
de
qualidade
com
a
qual
o
usuário
do

programa
interage.
Essa
é
a
qualidade
externa.

–  Um
Cpo
de
qualidade
com
a
qual
outros

desenvolvedores
interagem.
Essa
é
a
qualidade

interna.

Fatores de Fatores de
qualidade qualidade
externos? internos?
Fatores
de
Qualidade
Externos

•  Corretude
 Como O que é
verificar? isso?
•  Robustez

•  CompaCbilidade

Como Será verdade
•  Eficiência
 garantir que mais
simples é
•  Portabilidade
 isso? melhor?

•  Facilidade
de
uso
 Qual a
•  Funcionalidade
 diferença entre
segurança e
•  Segurança
 robustez?
Fatores
de
Qualidade
Internos

O que isso
•  Legibilidade
 tem a ver O que são
–  Documentação
 com a LP? padrões?
–  Padronização

–  Conscisão
 O que é Como garanti
r
software reusabilidade
•  Extensibilidade
 ?
extensível?
•  Reusabilidade

•  Depurabilidade
 O que é
software mais
depurável?
AnC‐Fatores
de
Qualidade
de
So?ware

•  Rigidez

–  Mudanças
em
uma
parte
do
programa
se

propagam
para
outras
partes.

•  Imobilidade

–  So?ware
que
é
diUcil
de
reusar.

•  “Gambiarras”

–  Soluções
simplistas
que
são
diUceis
de
manter.

O
que
é
rigidez

•  Um
so?ware
é
considerado
rígido
se
o
custo

de
alterá‐lo
for
alto.

•  Existem
programas
que
são

Exemplos de feitos
para
serem
rígidos.

software
rígido? •  E
há
programas
que

precisam
ser
flexíveis.

Qual é o
custo de Que
alterar um programas
programa? são esses?
Alterando
Programas

•  Custo
de
alterar
um
módulo
de
um
programa

=
custo
de
alterar
o
código
fonte
daquele

módulo
+
custo
de
propagar
as
mudanças
para

o
resto
do
programa.



Alguém poderia
compartilhar um
a
situação em que fo n ter
i m a
necessário altera
r Como
e c u s t o
um software? ess
baixo?
Encapsulação

•  O
segredo
para
diminuir
a
rigidez
de

programas
é
a
encapsulação.


O que Por que


O que é encapsulação encapsulaç
encapsulação tem a ver com a diminui a r
ão
igidez
de dados? linguagem de de softwar
e?
programação?
Um
Exemplo

•  Como
determinar
o
tamanho
de
uma
cadeia

de
caracteres
em
C?

Um
Exemplo

•  Como
determinar
o
tamanho
de
uma
cadeia

de
caracteres
em
C?

•  O
que
o
programa
abaixo
faz?

int main(int argc, char** argv) {
while(--argc >= 0) {
char *p;
int len = 0;
for (p = argv[argc]; *p != '\0'; p++) {
len++;
}
printf("Tamanho(%s) = %d\n", argv[argc], len);
}
}
Um
Exemplo

Esse problema
possui alguns
problemas. Qual Seria possível
o mais sério? resolver esse
problema?
int main(int argc, char** argv) {
while(--argc >= 0) {
char *p;
int len = 0;
for (p = argv[argc]; *p != '\0'; p++) {
len++;
}
printf("Tamanho(%s) = %d\n", argv[argc], len);
}
}
Um
Exemplo

•  Quais
as
vantages
do
programa
abaixo
com

relação
ao
primeiro
código?

A implementação
de cadeias de
caracteres em C
#include <string.h> é rígida ou
flexível?
int main(int argc, char** argv) {
while(--argc >= 0) {
int len = strlen(argv[argc]);
printf("Tamanho(%s) = %d\n", argv[argc], len);
}
}
Os
beneUcios
da
Encapsulação

•  A
separação
entre
interfaces
e

implementações
foi
uma
das
idéias
mais

espertas
em
ciência
da
computação.

•  Programa‐se
para
as
interfaces.

–  Interfaces
tendem
a
mudar
pouco.

•  Esconde‐se
a
implementação.

–  Outros
módulos
não
devem
depender
da

implementação.

–  Implementação
tende
a
mudar
muito.

Encapsulação
e
Linguagem
de

Programação

•  Algumas
linguagens
de
programação
não

fornecem
qualquer
recurso
para
encapsular

dados.

–  Exemplos:
python
e
C

•  Outras,
como
C++,
C#
e
Java
fornecem
esses

recursos:

–  public,
protected,
private
Imobilidade

•  Alguns
programas
não
são
feitos
para
serem

reuClizados.

–  Programadores
não
querem
morrer
de
fome.


Que programas
não são feitos
para serem
reusados?
Imobilidade

•  Alguns
programas
não
são
feitos
para
serem

reuClizados.

–  Programadores
não
querem
morrer
de
fome.


•  Mas
há
so?ware
que
é
feito
para
ser
reusado.

–  Bibliotecas

–  Arcabouços

Quais as
características
de programas
assim?
Em que cen
ários
Um
Exemplo
 a classe Re
pode ser
ct
reusada?
public class Rect extends View {
private final int x0, y0, x1, y1;
public Rect(Context c, int nx0, int ny0, int nx1, int ny1) {
super(c);
x0 = nx0; y0 = ny0; x1 = nx1; y1 = ny1;
setFocusable(true);
setMinimumWidth(x1 - x0); setMinimumHeight(y1 - y0);
}
protected void onMeasure(int w, int h) {
setMeasuredDimension(getSuggestedMinimumWidth(),
getSuggestedMinimumHeight());
}
protected void onDraw(Canvas canvas) {
Paint paint = new Paint(); Como deixar a
paint.setStyle(Style.FILL); classe Rect
paint.setColor(Color.WHITE); mais reusável?
canvas.drawRect(x0, y0, x1, y1, paint);
}
}
Responsabilidades


Desenhistas


“Retângulos

Desenhistas”


Retângulos
 Que lição


tiramos
disso?
Responsabilidades


Desenhistas

Quanto mais simples for a
interface de“Retângulos

um tipo, em mais
situações diferentes conseguimos
Desenhistas”

reusar aquele tipo.

Retângulos

Gambiarras

•  Tratamento
especial
para
entradas
específicas


•  Tratamento
de
erros
sem
exceções


•  Tamanhos
arbitrários
de
estruturas
de
dados


•  Algoritmos
custosos
quando
existem
melhores

alternaCvas

Exemplos?
A
volta
dos
anagramas

•  Como
determinar
se
duas
strings
são

anagramas?

Uma
possível
solução

private boolean anagrams(final String s1, String s2) {
for (int i = 0; i < s1.length(); i++) {
if (s2.indexOf(s1.charAt(i) + "") >= 0) {
s2 = s2.replaceFirst("" + s1.charAt(i), "");
} else {
return false;
}
}
return s2.length() == 0;
} Como a solução
poderia ser
melhorada?
Qual a
complexidade
?
dessa solução
Solução
baseada
em
Hash

private boolean anagrams(final String s1, final String s2) {
boolean yes = true;
if (s1.length() != s2.length()) {
yes = false; Qual a
} else { complexidade
int[] table = new int[TABLE_SIZE]; assimtótica
for (int i = 0; i < s1.length(); i++) { dessa solução?
table[s1.charAt(i)]++;
}
for (int i = 0; i < s2.length(); i++) {
if (table[s2.charAt(i)] == 0) {
yes = false;
break; Que código é
} else { mais
table[s2.charAt(i)]--;
} complexo?
}
}
return yes;
}
A
Solução
Final

public
class
AnagramAcCvity
extends
AcCvity
{



private
staCc
final
int
TABLE_SIZE
=
128;

anagrams.xml



private
boolean
anagrams(final
String
s1,
final
String
s2)
{…}
 <LinearLayout



private
boolean
anagramsQuadraCc(final
String
s1,
String
s2)
{…}
 



xmlns:android="h/p://schemas.android.com/apk/res/android"



public
final
void
onCreate(final
Bundle
state)
{
 



android:id="@+id/root"





super.onCreate(state);
 



android:layout_width="fill_parent"





setContentView(R.layout.anagrams);
 



android:layout_height="wrap_content"





final
EditText
tb1
=
(EditText)
findViewById(R.id.text1);
 



android:orientaCon="ver?cal"
>





final
EditText
tb2
=
(EditText)
findViewById(R.id.text2);
 



<EditText





((Buton)
findViewById(R.id.buton1))
 







android:id="@+id/text1"









.setOnClickListener(new
Buton.OnClickListener()
{
 







android:layout_width="fill_parent"











public
void
onClick(final
View
arg0)
{
 







android:layout_height="fill_parent"













Context
context
=
getApplicaConContext();
 







android:layout_weight="1"













int
duraCon
=
Toast.LENGTH_SHORT;
 







android:focusable="true"













CharSequence
text
=
"Nao
sao
anagramas!";
 







android:text="@string/defaultLeEText"
/>













if
(anagramsQuadraCc(tb1.getText().toString(),

 



<EditText















b2.getText().toString()))
{
 







android:id="@+id/text2"















text
=
"Anagrams!";
 







android:layout_width="fill_parent"













}
 







android:layout_height="fill_parent"













Toast
toast
=
Toast.makeText(context,
text,
duraCon);
 







android:layout_weight="1"













toast.show();
 







android:focusable="true"











}
 







android:text="@string/defaultRightText"
/>









});
 



<Buton



}
 







android:id="@+id/bu/on1"

}
 







android:layout_width="fill_parent"









android:layout_height="fill_parent"

AnagramAcCvity.java
 







android:layout_weight="1"









android:text="@string/labelAnagram"
/>

</LinearLayout>

Ainda
sobre
as
Gambiarras

•  Passada
a
fase
de
protoCpação,
vale
a
pena

dedicar
esforço
a
código
que
será
usado,
ou

reusado,
muitas
vezes.


Qual a
diferença entre
esses dois
conceitos?
O
que
é
um
bom
programador?

•  Quais
são
as
habilidades
mais

úteis?

–  Saber
digitar
rápido
é
úCl?

–  Saber
escrever
bem
é
úCl?

–  Entender
de
algoritmos
é
úCl?

Habilidades
de
Projeto

•  Aprenda
a
reusar
código.

•  Aprenda
padrões
de
projeto.

•  Aprenda
bem
uma
linguagem
de
programação.

•  Aprenda
um
pouco
sobre
várias
linguagens.

•  Aprenda
a
documentar
com
sabedoria.

•  Aprenda
a
manipular
a
IDE.

•  Aprenda
a
realizar
testes
de
unidade.

•  Aprenda
a
montar
arcabouços
de
teste.

Habilidades
de
Depuração

•  Aprenda
a
depurar
erros.

–  Divida
o
espaço
de
busca.

–  Aprenda
a
ler
logs.

–  Aprenda
a
usar
depuradores
automáCcos.

–  Aprenda
a
lidar
com
bugs
intermitentes.

•  Aprenda
sobre
bugs
de
desempenho.

–  Aprenda
a
oCmizar
loops.

–  Aprenda
a
lidar
com
I/O.

•  Aprenda
a
conduzir
experimentos

Habilidades
de
Grupo

•  Aprenda
a
fazer
esCmaCvas
de
esforço.

–  EsCmaCvas
individuais
e
de
grupo.

•  Aprenda
a
encontrar
informações.

–  UClizando
pessoas
como
fontes
de
informação.

•  Aprenda
a
trabalhar
com
código
ruim.

•  Aprenda
a
usar
ferramentas
de
controle
de

versão.

•  Aprenda
a
lidar
com
código
de
terceiros.

•  Aprenda
a
discordar.

Habilidades
Individuais

•  Aprenda
a
aprender
novas
habilidades.

•  Aprenda
a
parar
de
trabalhar
quando
esCver

cançado.

•  Aprenda
a
lidar
com
pessoas
diUceis.

•  Aprenda
a
trocar
qualidade
por
tempo
de

desenvolvimento.

•  Aprenda
a
decidir
entre
comprar
e
fazer.

•  Aprenda
a
se
manter
moCvado.


Você também pode gostar