Escolar Documentos
Profissional Documentos
Cultura Documentos
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.
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”
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.