SlideShare a Scribd company logo
source code quality
Alberto Simões
March 10, 2015 – ESEIG-IPP – Vila do Conde
Departamento de Informática
Universidade do Minho
outline
Motivation
Code Structure
Code Documentation
Testing
1
motivation
no bad code initiative
3
code problems
∙ Legibility Issues;
4
code problems
∙ Legibility Issues;
∙ Code should document itself;
4
code problems
∙ Legibility Issues;
∙ Code should document itself;
∙ Code should be easy to read;
4
code problems
∙ Legibility Issues;
∙ Code should document itself;
∙ Code should be easy to read;
∙ Code should be elegant!
4
code problems
∙ Legibility Issues;
∙ Code should document itself;
∙ Code should be easy to read;
∙ Code should be elegant!
∙ Documentation Issues;
4
code problems
∙ Legibility Issues;
∙ Code should document itself;
∙ Code should be easy to read;
∙ Code should be elegant!
∙ Documentation Issues;
∙ Documentation should exist;
4
code problems
∙ Legibility Issues;
∙ Code should document itself;
∙ Code should be easy to read;
∙ Code should be elegant!
∙ Documentation Issues;
∙ Documentation should exist;
∙ Documentation should follow standards;
4
code problems
∙ Legibility Issues;
∙ Code should document itself;
∙ Code should be easy to read;
∙ Code should be elegant!
∙ Documentation Issues;
∙ Documentation should exist;
∙ Documentation should follow standards;
∙ Documentation should document!
4
code problems
∙ Legibility Issues;
∙ Code should document itself;
∙ Code should be easy to read;
∙ Code should be elegant!
∙ Documentation Issues;
∙ Documentation should exist;
∙ Documentation should follow standards;
∙ Documentation should document!
∙ Testing Issues;
4
code problems
∙ Legibility Issues;
∙ Code should document itself;
∙ Code should be easy to read;
∙ Code should be elegant!
∙ Documentation Issues;
∙ Documentation should exist;
∙ Documentation should follow standards;
∙ Documentation should document!
∙ Testing Issues;
∙ Code should work on correct input;
4
code problems
∙ Legibility Issues;
∙ Code should document itself;
∙ Code should be easy to read;
∙ Code should be elegant!
∙ Documentation Issues;
∙ Documentation should exist;
∙ Documentation should follow standards;
∙ Documentation should document!
∙ Testing Issues;
∙ Code should work on correct input;
∙ Code should work on incorrect input;
4
code problems
∙ Legibility Issues;
∙ Code should document itself;
∙ Code should be easy to read;
∙ Code should be elegant!
∙ Documentation Issues;
∙ Documentation should exist;
∙ Documentation should follow standards;
∙ Documentation should document!
∙ Testing Issues;
∙ Code should work on correct input;
∙ Code should work on incorrect input;
∙ Code should be tested on every change!
4
code structure
code structure
6
use meaningful identifiers
What does this code do?
int x(string g[]) {
string p = g[0]; int o = p.length();
for (z=1;z<g.length;++z) {
if (g[z].length()>o) { p=g[z];o=p.length(); }
}
return o;
}
7
use meaningful identifiers
Is this better?
int x(string list[]) {
string maxString = list[0];
int maxSize = maxString.length();
for (i=1;i<list.length;++i) {
if (list[i].length()>maxSize) { maxString=list[i];
maxSize=maxString.length(); }
}
return maxSize;
}
8
use coherent indentation
Do you prefer this…
int x(string list[]) {
string maxString = list[0];
int maxSize = maxString.length();
for (i=1;i<list.length;++i) {
if (list[i].length()>maxSize) { maxString=list[i];
maxSize=maxString.length(); }
}
return maxSize;
}
9
use coherent indentation
or this?
int x(string list[]) {
string maxString = list[0];
int maxSize = maxString.length();
for (i=1;i<list.length;++i) {
if (list[i].length()>maxSize) {
maxString=list[i];
maxSize=maxString.length();
}
}
return maxSize;
}
10
use coherent identifiers
int x(string Lists[]) {
string max_String = Lista[0];
int maxSize = max_String.length();
for (i=1;i<Lista.length;++i) {
if (Lista[i].length()>maxSize) {
max_String=Lista[i];
maxSize=max_String.length();
}
}
return maxSize;
}
11
use coherent identifiers
Choose:
∙ One language:
I prefer English given keywords are English, but any will work!
12
use coherent identifiers
Choose:
∙ One language:
I prefer English given keywords are English, but any will work!
∙ Use one variable style:
If you prefer use CamelCaseIdentifiers;
Or, why not, underscores_identifiers;
but not both!
12
use coherent identifiers
Choose:
∙ One language:
I prefer English given keywords are English, but any will work!
∙ Use one variable style:
If you prefer use CamelCaseIdentifiers;
Or, why not, underscores_identifiers;
but not both!
∙ Note that some languages have conventions:
Java libraries use CamelCase;
GNU Toolkit (GTK+) use underscores;
So, probably a good idea to follow the flow…
12
use standard code structure
Does this work?
int x(string list[]) {
; string maxString = list[0]
; int maxSize = maxString.length()
; for (i=1;i<list.length;++i)
if (list[i].length()>maxSize) {
; maxString=list[i]
; maxSize=maxString.length()
; }
; return maxSize
; }
Isn’t it cute?
13
use standard and coherent code structure
Choose one, but stick to it!
int x(string list[]) {
string maxString = list[0];
int maxSize = maxString.length();
for (i=1;i<list.length;++i)
if (list[i].length()>maxSize) {
maxString=list[i];
maxSize=maxString.length();
}
return maxSize;
}
int x(string list[])
{
string maxString = list[0];
int maxSize = maxString.length();
for (i=1;i<list.length;++i)
if (list[i].length()>maxSize)
{
maxString=list[i];
maxSize=maxString.length();
}
return maxSize;
}
14
use vertical alignment
Most editors suck and mess with vertical alignment.
Nevertheless, it is useful.
See the error?
Sprite tank=LoadSprite(”path/to/sprites/tank.png”);
Sprite chopper=LoadSprite(”path/to/sprtes/chopper.png”);
Sprite balloons=LoadSprite(”path/to/sprites/balloons.png”);
15
use vertical alignment
Most editors suck and mess with vertical alignment.
Nevertheless, it is useful.
See the error?
Sprite tank=LoadSprite(”path/to/sprites/tank.png”);
Sprite chopper=LoadSprite(”path/to/sprtes/chopper.png”);
Sprite balloons=LoadSprite(”path/to/sprites/balloons.png”);
And now?
Sprite tank = LoadSprite(”path/to/sprites/tank.png”);
Sprite chopper = LoadSprite(”path/to/sprtes/chopper.png”);
Sprite balloons = LoadSprite(”path/to/sprites/balloons.png”);
15
be explicit
C, Java and C# are tolerant, so you can write
if (foo < bar)
do_something(foo, bar);
Look, m’a! No curly brackets!
16
be explicit
C, Java and C# are tolerant, so you can write
if (foo < bar)
do_something(foo, bar);
Look, m’a! No curly brackets!
Problem? Later you might need to add an action and probably you
will add it like this:
if (foo < bar)
do_something(foo, bar);
do_something_else(foo, bar);
And does that do what you mean?
16
be explicit ii
So, how do you read this?
if (a < b)
if (b < c)
a = c;
else
c = b;
Or, more important, how does the compiler read it?
17
be explicit ii
So, how do you read this?
if (a < b)
if (b < c)
a = c;
else
c = b;
Or, more important, how does the compiler read it?
if (a < b)
if (b < c)
a = c;
else
c = b;
if (a < b)
if (b < c)
a = c;
else
c = b;
17
be explicit ii
Better with curly brackets!
if (a < b) {
if (b < c) {
a = c;
}
}
else {
c = b;
}
if (a < b) {
if (b < c) {
a = c;
}
else {
c = b;
}
}
Even without indentation you can understand it properly!!
And better! You do not need to know how the compiler interprets it.
18
use proper data structures
Implement related data as a data structure.
So, in pacman we have four ghosts. Store their positions.
int g1x, g1y, g2x, g2y, g3x, g3y, g4x, g4y;
19
use proper data structures
Implement related data as a data structure.
So, in pacman we have four ghosts. Store their positions.
int g1x, g1y, g2x, g2y, g3x, g3y, g4x, g4y;
There are only four, right? And it works!
19
use proper data structures
Implement related data as a data structure.
So, in pacman we have four ghosts. Store their positions.
int g1x, g1y, g2x, g2y, g3x, g3y, g4x, g4y;
There are only four, right? And it works!
Probably better:
class Pair { public int x, y; };
Pair[] ghost = new Pair[4];
// now use ghost[0].x, ghost[1].y, etc
19
code documentation
documentation
21
should it exist?
Real programmers don’t comment their code,
if it was hard to write,
it should be hard to understand and harder to modify.
— unknown
22
should it exist?
Real programmers don’t comment their code,
if it was hard to write,
it should be hard to understand and harder to modify.
— unknown
Kidding. It should really exist!
22
is this documentation?
/* Computes the length of the longer string */
int LongestString(string list[])
{
string maxString = list[0];
int maxSize = maxString.length();
for (i=1; i<list.length; i++) {
if (list[i].length() > maxSize) {
maxString = list[i];
maxSize = maxString.length();
}
}
return maxSize;
}
23
is this documentation?
/* Computes the length of the longer string */
int LongestString(string list[])
{
string maxString = list[0];
int maxSize = maxString.length();
for (i=1; i<list.length; i++) {
if (list[i].length() > maxSize) {
maxString = list[i];
maxSize = maxString.length();
}
}
return maxSize;
}
Not really!
23
documentation relevance
Documentation is like sex:
when it is good, it is very, very good;
and when it is bad, it is better than nothing.
— Dick Brandon (?)
24
documentation content
Try to include:
∙ What the code is about;
∙ What are each of the input arguments/parameters;
∙ What is the type and content of the returned value;
∙ If any of the method/function parameters are for output;
∙ What restrictions does the input values have?
∙ What happens when you do not follow that restriction?
∙ What exceptions are thrown directy?
∙ What exceptions are not catched and might be propagated?
∙ What is the algorithm?
25
use standards
Most programming languages have a standard documentation
approach:
∙ Perl has POD;
∙ Java has JavaDoc;
∙ Haskell has Hadock;
∙ C# has “XML Comments”;
∙ Python has Sphinx;
∙ C has Doxygen;
∙ C++ has Doxygen too;
∙ Lots of cross-language tools;
26
example: javadoc
/**
* Given an array of strings, compute the length of the
* longest string.
* <p>
* This method will not work for empty lists.
*
* @param list the list of strings to be processed;
* @return the size of the longest string
* in the array;
*/
int LongestString(string list[])
{
string maxString = list[0];
int maxSize = maxString.length();
for (i=1; i<list.length; i++) {
[...]
27
testing
testing
29
does this work?
int LongestString(string list[])
{
string maxString = list[0];
int maxSize = maxString.length();
for (i=1; i<list.length; i++) {
if (list[i].length() > maxSize) {
maxString = list[i];
maxSize = maxString.length();
}
}
return maxSize;
}
30
does this work?
int LongestString(string list[])
{
string maxString = list[0];
int maxSize = maxString.length();
for (i=1; i<list.length; i++) {
if (list[i].length() > maxSize) {
maxString = list[i];
maxSize = maxString.length();
}
}
return maxSize;
}
Always!?
30
does this work?
int LongestString(string list[])
{
string maxString = list[0];
int maxSize = maxString.length();
for (i=1; i<list.length; i++) {
if (list[i].length() > maxSize) {
maxString = list[i];
maxSize = maxString.length();
}
}
return maxSize;
}
Always!?
What happens on the empty list?
30
unit testing
∙ Different tools have different approaches/tools;
∙ The idea is the same: test!
31
unit testing
∙ Different tools have different approaches/tools;
∙ The idea is the same: test!
∙ What to test?
31
unit testing
∙ Different tools have different approaches/tools;
∙ The idea is the same: test!
∙ What to test?
∙ Everything!
∙ Test a simple case;
∙ Test a large case;
∙ Test weird cases;
∙ Test limit cases!
31
do it yourself testing
static class Test {
static void is(int a, int b) {
System.out.println( a == b ? ”ok” : ”nok” );
}
}
32
do it yourself testing
static class Test {
static void is(int a, int b) {
System.out.println( a == b ? ”ok” : ”nok” );
}
}
Then…
string[] array = { ”banana”, ”apple”, ”strawberry” };
Test.is( 10, LongestString(array) );
string[] array1 = { ”pear” };
Test.is( 4, LongestString(array) );
32
do it yourself testing
You can ever try and test if a method throws an exception!
static class Test {
static void throws(Runnable code, Class<?> class) {
boolean ok = false;
try {
code.run();
} catch (Exception e) {
if (e instanceof class) ok = true;
}
System.out.println( ok ? ”ok” : ”nok” );
}
}
Non Tested Code!
33
testing: why?
∙ To know your code is working;
∙ To know your code is still working;
∙ To know that your latest change does not mess with your
working code;
34
must read
How To Write Unmaintainable Code
by Roedy Green
https://www.thc.org/root/phun/unmaintain.html
Thank you!
35

More Related Content

Similar to Source Code Quality

Perfect Code
Perfect CodePerfect Code
Perfect Code
Artem Tabalin
 
ACM init() Spring 2015 Day 1
ACM init() Spring 2015 Day 1ACM init() Spring 2015 Day 1
ACM init() Spring 2015 Day 1
UCLA Association of Computing Machinery
 
Python Presentation
Python PresentationPython Presentation
Python Presentation
Narendra Sisodiya
 
Clean Code 2
Clean Code 2Clean Code 2
Clean Code 2
Fredrik Wendt
 
Undefined behavior is closer than you think
Undefined behavior is closer than you thinkUndefined behavior is closer than you think
Undefined behavior is closer than you think
Andrey Karpov
 
Presentation 2nd
Presentation 2ndPresentation 2nd
Presentation 2ndConnex
 
Keep Code Left - How to write better code in almost any language
Keep Code Left - How to write better code in almost any languageKeep Code Left - How to write better code in almost any language
Keep Code Left - How to write better code in almost any language
Mick Andrew
 
270_1_CIntro_Up_To_Functions.ppt
270_1_CIntro_Up_To_Functions.ppt270_1_CIntro_Up_To_Functions.ppt
270_1_CIntro_Up_To_Functions.ppt
UdhayaKumar175069
 
Survey of programming language getting started in C
Survey of programming language getting started in CSurvey of programming language getting started in C
Survey of programming language getting started in C
ummeafruz
 
270 1 c_intro_up_to_functions
270 1 c_intro_up_to_functions270 1 c_intro_up_to_functions
270 1 c_intro_up_to_functions
ray143eddie
 
270_1_CIntro_Up_To_Functions.ppt
270_1_CIntro_Up_To_Functions.ppt270_1_CIntro_Up_To_Functions.ppt
270_1_CIntro_Up_To_Functions.ppt
Alefya1
 
Safety of 64-bit code
Safety of 64-bit codeSafety of 64-bit code
Safety of 64-bit code
PVS-Studio
 
Contest Tips and Tricks
Contest Tips and TricksContest Tips and Tricks
Contest Tips and Tricksmbuzdalov
 
About size_t and ptrdiff_t
About size_t and ptrdiff_tAbout size_t and ptrdiff_t
About size_t and ptrdiff_t
PVS-Studio
 
270_1_CIntro_Up_To_Functions.ppt
270_1_CIntro_Up_To_Functions.ppt270_1_CIntro_Up_To_Functions.ppt
270_1_CIntro_Up_To_Functions.ppt
JoshCasas1
 
Fuzzing - Part 1
Fuzzing - Part 1Fuzzing - Part 1
Fuzzing - Part 1
UTD Computer Security Group
 
C++ lecture 01
C++   lecture 01C++   lecture 01
C++ lecture 01
HNDE Labuduwa Galle
 
C++ Unit 1PPT which contains the Introduction and basic o C++ with OOOps conc...
C++ Unit 1PPT which contains the Introduction and basic o C++ with OOOps conc...C++ Unit 1PPT which contains the Introduction and basic o C++ with OOOps conc...
C++ Unit 1PPT which contains the Introduction and basic o C++ with OOOps conc...
ANUSUYA S
 
Clean code and code smells
Clean code and code smellsClean code and code smells
Clean code and code smells
Md. Aftab Uddin Kajal
 

Similar to Source Code Quality (20)

Perfect Code
Perfect CodePerfect Code
Perfect Code
 
ACM init() Spring 2015 Day 1
ACM init() Spring 2015 Day 1ACM init() Spring 2015 Day 1
ACM init() Spring 2015 Day 1
 
Python Presentation
Python PresentationPython Presentation
Python Presentation
 
Clean Code 2
Clean Code 2Clean Code 2
Clean Code 2
 
Undefined behavior is closer than you think
Undefined behavior is closer than you thinkUndefined behavior is closer than you think
Undefined behavior is closer than you think
 
Presentation 2nd
Presentation 2ndPresentation 2nd
Presentation 2nd
 
Anti-Patterns
Anti-PatternsAnti-Patterns
Anti-Patterns
 
Keep Code Left - How to write better code in almost any language
Keep Code Left - How to write better code in almost any languageKeep Code Left - How to write better code in almost any language
Keep Code Left - How to write better code in almost any language
 
270_1_CIntro_Up_To_Functions.ppt
270_1_CIntro_Up_To_Functions.ppt270_1_CIntro_Up_To_Functions.ppt
270_1_CIntro_Up_To_Functions.ppt
 
Survey of programming language getting started in C
Survey of programming language getting started in CSurvey of programming language getting started in C
Survey of programming language getting started in C
 
270 1 c_intro_up_to_functions
270 1 c_intro_up_to_functions270 1 c_intro_up_to_functions
270 1 c_intro_up_to_functions
 
270_1_CIntro_Up_To_Functions.ppt
270_1_CIntro_Up_To_Functions.ppt270_1_CIntro_Up_To_Functions.ppt
270_1_CIntro_Up_To_Functions.ppt
 
Safety of 64-bit code
Safety of 64-bit codeSafety of 64-bit code
Safety of 64-bit code
 
Contest Tips and Tricks
Contest Tips and TricksContest Tips and Tricks
Contest Tips and Tricks
 
About size_t and ptrdiff_t
About size_t and ptrdiff_tAbout size_t and ptrdiff_t
About size_t and ptrdiff_t
 
270_1_CIntro_Up_To_Functions.ppt
270_1_CIntro_Up_To_Functions.ppt270_1_CIntro_Up_To_Functions.ppt
270_1_CIntro_Up_To_Functions.ppt
 
Fuzzing - Part 1
Fuzzing - Part 1Fuzzing - Part 1
Fuzzing - Part 1
 
C++ lecture 01
C++   lecture 01C++   lecture 01
C++ lecture 01
 
C++ Unit 1PPT which contains the Introduction and basic o C++ with OOOps conc...
C++ Unit 1PPT which contains the Introduction and basic o C++ with OOOps conc...C++ Unit 1PPT which contains the Introduction and basic o C++ with OOOps conc...
C++ Unit 1PPT which contains the Introduction and basic o C++ with OOOps conc...
 
Clean code and code smells
Clean code and code smellsClean code and code smells
Clean code and code smells
 

More from Alberto Simões

Language Identification: A neural network approach
Language Identification: A neural network approachLanguage Identification: A neural network approach
Language Identification: A neural network approach
Alberto Simões
 
Google Maps JS API
Google Maps JS APIGoogle Maps JS API
Google Maps JS API
Alberto Simões
 
Making the most of a 100-year-old dictionary
Making the most of a 100-year-old dictionaryMaking the most of a 100-year-old dictionary
Making the most of a 100-year-old dictionary
Alberto Simões
 
Dictionary Alignment by Rewrite-based Entry Translation
Dictionary Alignment by Rewrite-based Entry TranslationDictionary Alignment by Rewrite-based Entry Translation
Dictionary Alignment by Rewrite-based Entry Translation
Alberto Simões
 
EMLex-A5: Specialized Dictionaries
EMLex-A5: Specialized DictionariesEMLex-A5: Specialized Dictionaries
EMLex-A5: Specialized Dictionaries
Alberto Simões
 
Modelação de Dados
Modelação de DadosModelação de Dados
Modelação de Dados
Alberto Simões
 
Aula 04 - Introdução aos Diagramas de Sequência
Aula 04 - Introdução aos Diagramas de SequênciaAula 04 - Introdução aos Diagramas de Sequência
Aula 04 - Introdução aos Diagramas de Sequência
Alberto Simões
 
Aula 03 - Introdução aos Diagramas de Atividade
Aula 03 - Introdução aos Diagramas de AtividadeAula 03 - Introdução aos Diagramas de Atividade
Aula 03 - Introdução aos Diagramas de Atividade
Alberto Simões
 
Aula 02 - Engenharia de Requisitos
Aula 02 - Engenharia de RequisitosAula 02 - Engenharia de Requisitos
Aula 02 - Engenharia de Requisitos
Alberto Simões
 
Aula 01 - Planeamento de Sistemas de Informação
Aula 01 - Planeamento de Sistemas de InformaçãoAula 01 - Planeamento de Sistemas de Informação
Aula 01 - Planeamento de Sistemas de Informação
Alberto Simões
 
Building C and C++ libraries with Perl
Building C and C++ libraries with PerlBuilding C and C++ libraries with Perl
Building C and C++ libraries with Perl
Alberto Simões
 
PLN em Perl
PLN em PerlPLN em Perl
PLN em Perl
Alberto Simões
 
Redes de Pert
Redes de PertRedes de Pert
Redes de Pert
Alberto Simões
 
Dancing Tutorial
Dancing TutorialDancing Tutorial
Dancing Tutorial
Alberto Simões
 
Processing XML: a rewriting system approach
Processing XML: a rewriting system approachProcessing XML: a rewriting system approach
Processing XML: a rewriting system approach
Alberto Simões
 
Sistemas de Numeração
Sistemas de NumeraçãoSistemas de Numeração
Sistemas de Numeração
Alberto Simões
 
Álgebra de Boole
Álgebra de BooleÁlgebra de Boole
Álgebra de Boole
Alberto Simões
 
Arquitecturas de Tradução Automática
Arquitecturas de Tradução AutomáticaArquitecturas de Tradução Automática
Arquitecturas de Tradução Automática
Alberto Simões
 
Extracção de Recursos para Tradução Automática
Extracção de Recursos para Tradução AutomáticaExtracção de Recursos para Tradução Automática
Extracção de Recursos para Tradução Automática
Alberto Simões
 
Dicionário Aberto
Dicionário AbertoDicionário Aberto
Dicionário Aberto
Alberto Simões
 

More from Alberto Simões (20)

Language Identification: A neural network approach
Language Identification: A neural network approachLanguage Identification: A neural network approach
Language Identification: A neural network approach
 
Google Maps JS API
Google Maps JS APIGoogle Maps JS API
Google Maps JS API
 
Making the most of a 100-year-old dictionary
Making the most of a 100-year-old dictionaryMaking the most of a 100-year-old dictionary
Making the most of a 100-year-old dictionary
 
Dictionary Alignment by Rewrite-based Entry Translation
Dictionary Alignment by Rewrite-based Entry TranslationDictionary Alignment by Rewrite-based Entry Translation
Dictionary Alignment by Rewrite-based Entry Translation
 
EMLex-A5: Specialized Dictionaries
EMLex-A5: Specialized DictionariesEMLex-A5: Specialized Dictionaries
EMLex-A5: Specialized Dictionaries
 
Modelação de Dados
Modelação de DadosModelação de Dados
Modelação de Dados
 
Aula 04 - Introdução aos Diagramas de Sequência
Aula 04 - Introdução aos Diagramas de SequênciaAula 04 - Introdução aos Diagramas de Sequência
Aula 04 - Introdução aos Diagramas de Sequência
 
Aula 03 - Introdução aos Diagramas de Atividade
Aula 03 - Introdução aos Diagramas de AtividadeAula 03 - Introdução aos Diagramas de Atividade
Aula 03 - Introdução aos Diagramas de Atividade
 
Aula 02 - Engenharia de Requisitos
Aula 02 - Engenharia de RequisitosAula 02 - Engenharia de Requisitos
Aula 02 - Engenharia de Requisitos
 
Aula 01 - Planeamento de Sistemas de Informação
Aula 01 - Planeamento de Sistemas de InformaçãoAula 01 - Planeamento de Sistemas de Informação
Aula 01 - Planeamento de Sistemas de Informação
 
Building C and C++ libraries with Perl
Building C and C++ libraries with PerlBuilding C and C++ libraries with Perl
Building C and C++ libraries with Perl
 
PLN em Perl
PLN em PerlPLN em Perl
PLN em Perl
 
Redes de Pert
Redes de PertRedes de Pert
Redes de Pert
 
Dancing Tutorial
Dancing TutorialDancing Tutorial
Dancing Tutorial
 
Processing XML: a rewriting system approach
Processing XML: a rewriting system approachProcessing XML: a rewriting system approach
Processing XML: a rewriting system approach
 
Sistemas de Numeração
Sistemas de NumeraçãoSistemas de Numeração
Sistemas de Numeração
 
Álgebra de Boole
Álgebra de BooleÁlgebra de Boole
Álgebra de Boole
 
Arquitecturas de Tradução Automática
Arquitecturas de Tradução AutomáticaArquitecturas de Tradução Automática
Arquitecturas de Tradução Automática
 
Extracção de Recursos para Tradução Automática
Extracção de Recursos para Tradução AutomáticaExtracção de Recursos para Tradução Automática
Extracção de Recursos para Tradução Automática
 
Dicionário Aberto
Dicionário AbertoDicionário Aberto
Dicionário Aberto
 

Recently uploaded

Lecture 1 Introduction to games development
Lecture 1 Introduction to games developmentLecture 1 Introduction to games development
Lecture 1 Introduction to games development
abdulrafaychaudhry
 
top nidhi software solution freedownload
top nidhi software solution freedownloadtop nidhi software solution freedownload
top nidhi software solution freedownload
vrstrong314
 
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, BetterWebinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
XfilesPro
 
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Globus
 
RISE with SAP and Journey to the Intelligent Enterprise
RISE with SAP and Journey to the Intelligent EnterpriseRISE with SAP and Journey to the Intelligent Enterprise
RISE with SAP and Journey to the Intelligent Enterprise
Srikant77
 
How to Position Your Globus Data Portal for Success Ten Good Practices
How to Position Your Globus Data Portal for Success Ten Good PracticesHow to Position Your Globus Data Portal for Success Ten Good Practices
How to Position Your Globus Data Portal for Success Ten Good Practices
Globus
 
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data AnalysisProviding Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
Globus
 
Prosigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology SolutionsProsigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology Solutions
Prosigns
 
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Shahin Sheidaei
 
Into the Box 2024 - Keynote Day 2 Slides.pdf
Into the Box 2024 - Keynote Day 2 Slides.pdfInto the Box 2024 - Keynote Day 2 Slides.pdf
Into the Box 2024 - Keynote Day 2 Slides.pdf
Ortus Solutions, Corp
 
Large Language Models and the End of Programming
Large Language Models and the End of ProgrammingLarge Language Models and the End of Programming
Large Language Models and the End of Programming
Matt Welsh
 
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus
 
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
informapgpstrackings
 
A Comprehensive Look at Generative AI in Retail App Testing.pdf
A Comprehensive Look at Generative AI in Retail App Testing.pdfA Comprehensive Look at Generative AI in Retail App Testing.pdf
A Comprehensive Look at Generative AI in Retail App Testing.pdf
kalichargn70th171
 
Vitthal Shirke Microservices Resume Montevideo
Vitthal Shirke Microservices Resume MontevideoVitthal Shirke Microservices Resume Montevideo
Vitthal Shirke Microservices Resume Montevideo
Vitthal Shirke
 
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Globus
 
SOCRadar Research Team: Latest Activities of IntelBroker
SOCRadar Research Team: Latest Activities of IntelBrokerSOCRadar Research Team: Latest Activities of IntelBroker
SOCRadar Research Team: Latest Activities of IntelBroker
SOCRadar
 
Developing Distributed High-performance Computing Capabilities of an Open Sci...
Developing Distributed High-performance Computing Capabilities of an Open Sci...Developing Distributed High-performance Computing Capabilities of an Open Sci...
Developing Distributed High-performance Computing Capabilities of an Open Sci...
Globus
 
Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...
Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...
Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...
Anthony Dahanne
 
Enhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdfEnhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdf
Globus
 

Recently uploaded (20)

Lecture 1 Introduction to games development
Lecture 1 Introduction to games developmentLecture 1 Introduction to games development
Lecture 1 Introduction to games development
 
top nidhi software solution freedownload
top nidhi software solution freedownloadtop nidhi software solution freedownload
top nidhi software solution freedownload
 
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, BetterWebinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
 
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
 
RISE with SAP and Journey to the Intelligent Enterprise
RISE with SAP and Journey to the Intelligent EnterpriseRISE with SAP and Journey to the Intelligent Enterprise
RISE with SAP and Journey to the Intelligent Enterprise
 
How to Position Your Globus Data Portal for Success Ten Good Practices
How to Position Your Globus Data Portal for Success Ten Good PracticesHow to Position Your Globus Data Portal for Success Ten Good Practices
How to Position Your Globus Data Portal for Success Ten Good Practices
 
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data AnalysisProviding Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
 
Prosigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology SolutionsProsigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology Solutions
 
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
 
Into the Box 2024 - Keynote Day 2 Slides.pdf
Into the Box 2024 - Keynote Day 2 Slides.pdfInto the Box 2024 - Keynote Day 2 Slides.pdf
Into the Box 2024 - Keynote Day 2 Slides.pdf
 
Large Language Models and the End of Programming
Large Language Models and the End of ProgrammingLarge Language Models and the End of Programming
Large Language Models and the End of Programming
 
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024
 
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
 
A Comprehensive Look at Generative AI in Retail App Testing.pdf
A Comprehensive Look at Generative AI in Retail App Testing.pdfA Comprehensive Look at Generative AI in Retail App Testing.pdf
A Comprehensive Look at Generative AI in Retail App Testing.pdf
 
Vitthal Shirke Microservices Resume Montevideo
Vitthal Shirke Microservices Resume MontevideoVitthal Shirke Microservices Resume Montevideo
Vitthal Shirke Microservices Resume Montevideo
 
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
 
SOCRadar Research Team: Latest Activities of IntelBroker
SOCRadar Research Team: Latest Activities of IntelBrokerSOCRadar Research Team: Latest Activities of IntelBroker
SOCRadar Research Team: Latest Activities of IntelBroker
 
Developing Distributed High-performance Computing Capabilities of an Open Sci...
Developing Distributed High-performance Computing Capabilities of an Open Sci...Developing Distributed High-performance Computing Capabilities of an Open Sci...
Developing Distributed High-performance Computing Capabilities of an Open Sci...
 
Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...
Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...
Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...
 
Enhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdfEnhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdf
 

Source Code Quality

  • 1. source code quality Alberto Simões March 10, 2015 – ESEIG-IPP – Vila do Conde Departamento de Informática Universidade do Minho
  • 4. no bad code initiative 3
  • 6. code problems ∙ Legibility Issues; ∙ Code should document itself; 4
  • 7. code problems ∙ Legibility Issues; ∙ Code should document itself; ∙ Code should be easy to read; 4
  • 8. code problems ∙ Legibility Issues; ∙ Code should document itself; ∙ Code should be easy to read; ∙ Code should be elegant! 4
  • 9. code problems ∙ Legibility Issues; ∙ Code should document itself; ∙ Code should be easy to read; ∙ Code should be elegant! ∙ Documentation Issues; 4
  • 10. code problems ∙ Legibility Issues; ∙ Code should document itself; ∙ Code should be easy to read; ∙ Code should be elegant! ∙ Documentation Issues; ∙ Documentation should exist; 4
  • 11. code problems ∙ Legibility Issues; ∙ Code should document itself; ∙ Code should be easy to read; ∙ Code should be elegant! ∙ Documentation Issues; ∙ Documentation should exist; ∙ Documentation should follow standards; 4
  • 12. code problems ∙ Legibility Issues; ∙ Code should document itself; ∙ Code should be easy to read; ∙ Code should be elegant! ∙ Documentation Issues; ∙ Documentation should exist; ∙ Documentation should follow standards; ∙ Documentation should document! 4
  • 13. code problems ∙ Legibility Issues; ∙ Code should document itself; ∙ Code should be easy to read; ∙ Code should be elegant! ∙ Documentation Issues; ∙ Documentation should exist; ∙ Documentation should follow standards; ∙ Documentation should document! ∙ Testing Issues; 4
  • 14. code problems ∙ Legibility Issues; ∙ Code should document itself; ∙ Code should be easy to read; ∙ Code should be elegant! ∙ Documentation Issues; ∙ Documentation should exist; ∙ Documentation should follow standards; ∙ Documentation should document! ∙ Testing Issues; ∙ Code should work on correct input; 4
  • 15. code problems ∙ Legibility Issues; ∙ Code should document itself; ∙ Code should be easy to read; ∙ Code should be elegant! ∙ Documentation Issues; ∙ Documentation should exist; ∙ Documentation should follow standards; ∙ Documentation should document! ∙ Testing Issues; ∙ Code should work on correct input; ∙ Code should work on incorrect input; 4
  • 16. code problems ∙ Legibility Issues; ∙ Code should document itself; ∙ Code should be easy to read; ∙ Code should be elegant! ∙ Documentation Issues; ∙ Documentation should exist; ∙ Documentation should follow standards; ∙ Documentation should document! ∙ Testing Issues; ∙ Code should work on correct input; ∙ Code should work on incorrect input; ∙ Code should be tested on every change! 4
  • 19. use meaningful identifiers What does this code do? int x(string g[]) { string p = g[0]; int o = p.length(); for (z=1;z<g.length;++z) { if (g[z].length()>o) { p=g[z];o=p.length(); } } return o; } 7
  • 20. use meaningful identifiers Is this better? int x(string list[]) { string maxString = list[0]; int maxSize = maxString.length(); for (i=1;i<list.length;++i) { if (list[i].length()>maxSize) { maxString=list[i]; maxSize=maxString.length(); } } return maxSize; } 8
  • 21. use coherent indentation Do you prefer this… int x(string list[]) { string maxString = list[0]; int maxSize = maxString.length(); for (i=1;i<list.length;++i) { if (list[i].length()>maxSize) { maxString=list[i]; maxSize=maxString.length(); } } return maxSize; } 9
  • 22. use coherent indentation or this? int x(string list[]) { string maxString = list[0]; int maxSize = maxString.length(); for (i=1;i<list.length;++i) { if (list[i].length()>maxSize) { maxString=list[i]; maxSize=maxString.length(); } } return maxSize; } 10
  • 23. use coherent identifiers int x(string Lists[]) { string max_String = Lista[0]; int maxSize = max_String.length(); for (i=1;i<Lista.length;++i) { if (Lista[i].length()>maxSize) { max_String=Lista[i]; maxSize=max_String.length(); } } return maxSize; } 11
  • 24. use coherent identifiers Choose: ∙ One language: I prefer English given keywords are English, but any will work! 12
  • 25. use coherent identifiers Choose: ∙ One language: I prefer English given keywords are English, but any will work! ∙ Use one variable style: If you prefer use CamelCaseIdentifiers; Or, why not, underscores_identifiers; but not both! 12
  • 26. use coherent identifiers Choose: ∙ One language: I prefer English given keywords are English, but any will work! ∙ Use one variable style: If you prefer use CamelCaseIdentifiers; Or, why not, underscores_identifiers; but not both! ∙ Note that some languages have conventions: Java libraries use CamelCase; GNU Toolkit (GTK+) use underscores; So, probably a good idea to follow the flow… 12
  • 27. use standard code structure Does this work? int x(string list[]) { ; string maxString = list[0] ; int maxSize = maxString.length() ; for (i=1;i<list.length;++i) if (list[i].length()>maxSize) { ; maxString=list[i] ; maxSize=maxString.length() ; } ; return maxSize ; } Isn’t it cute? 13
  • 28. use standard and coherent code structure Choose one, but stick to it! int x(string list[]) { string maxString = list[0]; int maxSize = maxString.length(); for (i=1;i<list.length;++i) if (list[i].length()>maxSize) { maxString=list[i]; maxSize=maxString.length(); } return maxSize; } int x(string list[]) { string maxString = list[0]; int maxSize = maxString.length(); for (i=1;i<list.length;++i) if (list[i].length()>maxSize) { maxString=list[i]; maxSize=maxString.length(); } return maxSize; } 14
  • 29. use vertical alignment Most editors suck and mess with vertical alignment. Nevertheless, it is useful. See the error? Sprite tank=LoadSprite(”path/to/sprites/tank.png”); Sprite chopper=LoadSprite(”path/to/sprtes/chopper.png”); Sprite balloons=LoadSprite(”path/to/sprites/balloons.png”); 15
  • 30. use vertical alignment Most editors suck and mess with vertical alignment. Nevertheless, it is useful. See the error? Sprite tank=LoadSprite(”path/to/sprites/tank.png”); Sprite chopper=LoadSprite(”path/to/sprtes/chopper.png”); Sprite balloons=LoadSprite(”path/to/sprites/balloons.png”); And now? Sprite tank = LoadSprite(”path/to/sprites/tank.png”); Sprite chopper = LoadSprite(”path/to/sprtes/chopper.png”); Sprite balloons = LoadSprite(”path/to/sprites/balloons.png”); 15
  • 31. be explicit C, Java and C# are tolerant, so you can write if (foo < bar) do_something(foo, bar); Look, m’a! No curly brackets! 16
  • 32. be explicit C, Java and C# are tolerant, so you can write if (foo < bar) do_something(foo, bar); Look, m’a! No curly brackets! Problem? Later you might need to add an action and probably you will add it like this: if (foo < bar) do_something(foo, bar); do_something_else(foo, bar); And does that do what you mean? 16
  • 33. be explicit ii So, how do you read this? if (a < b) if (b < c) a = c; else c = b; Or, more important, how does the compiler read it? 17
  • 34. be explicit ii So, how do you read this? if (a < b) if (b < c) a = c; else c = b; Or, more important, how does the compiler read it? if (a < b) if (b < c) a = c; else c = b; if (a < b) if (b < c) a = c; else c = b; 17
  • 35. be explicit ii Better with curly brackets! if (a < b) { if (b < c) { a = c; } } else { c = b; } if (a < b) { if (b < c) { a = c; } else { c = b; } } Even without indentation you can understand it properly!! And better! You do not need to know how the compiler interprets it. 18
  • 36. use proper data structures Implement related data as a data structure. So, in pacman we have four ghosts. Store their positions. int g1x, g1y, g2x, g2y, g3x, g3y, g4x, g4y; 19
  • 37. use proper data structures Implement related data as a data structure. So, in pacman we have four ghosts. Store their positions. int g1x, g1y, g2x, g2y, g3x, g3y, g4x, g4y; There are only four, right? And it works! 19
  • 38. use proper data structures Implement related data as a data structure. So, in pacman we have four ghosts. Store their positions. int g1x, g1y, g2x, g2y, g3x, g3y, g4x, g4y; There are only four, right? And it works! Probably better: class Pair { public int x, y; }; Pair[] ghost = new Pair[4]; // now use ghost[0].x, ghost[1].y, etc 19
  • 41. should it exist? Real programmers don’t comment their code, if it was hard to write, it should be hard to understand and harder to modify. — unknown 22
  • 42. should it exist? Real programmers don’t comment their code, if it was hard to write, it should be hard to understand and harder to modify. — unknown Kidding. It should really exist! 22
  • 43. is this documentation? /* Computes the length of the longer string */ int LongestString(string list[]) { string maxString = list[0]; int maxSize = maxString.length(); for (i=1; i<list.length; i++) { if (list[i].length() > maxSize) { maxString = list[i]; maxSize = maxString.length(); } } return maxSize; } 23
  • 44. is this documentation? /* Computes the length of the longer string */ int LongestString(string list[]) { string maxString = list[0]; int maxSize = maxString.length(); for (i=1; i<list.length; i++) { if (list[i].length() > maxSize) { maxString = list[i]; maxSize = maxString.length(); } } return maxSize; } Not really! 23
  • 45. documentation relevance Documentation is like sex: when it is good, it is very, very good; and when it is bad, it is better than nothing. — Dick Brandon (?) 24
  • 46. documentation content Try to include: ∙ What the code is about; ∙ What are each of the input arguments/parameters; ∙ What is the type and content of the returned value; ∙ If any of the method/function parameters are for output; ∙ What restrictions does the input values have? ∙ What happens when you do not follow that restriction? ∙ What exceptions are thrown directy? ∙ What exceptions are not catched and might be propagated? ∙ What is the algorithm? 25
  • 47. use standards Most programming languages have a standard documentation approach: ∙ Perl has POD; ∙ Java has JavaDoc; ∙ Haskell has Hadock; ∙ C# has “XML Comments”; ∙ Python has Sphinx; ∙ C has Doxygen; ∙ C++ has Doxygen too; ∙ Lots of cross-language tools; 26
  • 48. example: javadoc /** * Given an array of strings, compute the length of the * longest string. * <p> * This method will not work for empty lists. * * @param list the list of strings to be processed; * @return the size of the longest string * in the array; */ int LongestString(string list[]) { string maxString = list[0]; int maxSize = maxString.length(); for (i=1; i<list.length; i++) { [...] 27
  • 51. does this work? int LongestString(string list[]) { string maxString = list[0]; int maxSize = maxString.length(); for (i=1; i<list.length; i++) { if (list[i].length() > maxSize) { maxString = list[i]; maxSize = maxString.length(); } } return maxSize; } 30
  • 52. does this work? int LongestString(string list[]) { string maxString = list[0]; int maxSize = maxString.length(); for (i=1; i<list.length; i++) { if (list[i].length() > maxSize) { maxString = list[i]; maxSize = maxString.length(); } } return maxSize; } Always!? 30
  • 53. does this work? int LongestString(string list[]) { string maxString = list[0]; int maxSize = maxString.length(); for (i=1; i<list.length; i++) { if (list[i].length() > maxSize) { maxString = list[i]; maxSize = maxString.length(); } } return maxSize; } Always!? What happens on the empty list? 30
  • 54. unit testing ∙ Different tools have different approaches/tools; ∙ The idea is the same: test! 31
  • 55. unit testing ∙ Different tools have different approaches/tools; ∙ The idea is the same: test! ∙ What to test? 31
  • 56. unit testing ∙ Different tools have different approaches/tools; ∙ The idea is the same: test! ∙ What to test? ∙ Everything! ∙ Test a simple case; ∙ Test a large case; ∙ Test weird cases; ∙ Test limit cases! 31
  • 57. do it yourself testing static class Test { static void is(int a, int b) { System.out.println( a == b ? ”ok” : ”nok” ); } } 32
  • 58. do it yourself testing static class Test { static void is(int a, int b) { System.out.println( a == b ? ”ok” : ”nok” ); } } Then… string[] array = { ”banana”, ”apple”, ”strawberry” }; Test.is( 10, LongestString(array) ); string[] array1 = { ”pear” }; Test.is( 4, LongestString(array) ); 32
  • 59. do it yourself testing You can ever try and test if a method throws an exception! static class Test { static void throws(Runnable code, Class<?> class) { boolean ok = false; try { code.run(); } catch (Exception e) { if (e instanceof class) ok = true; } System.out.println( ok ? ”ok” : ”nok” ); } } Non Tested Code! 33
  • 60. testing: why? ∙ To know your code is working; ∙ To know your code is still working; ∙ To know that your latest change does not mess with your working code; 34
  • 61. must read How To Write Unmaintainable Code by Roedy Green https://www.thc.org/root/phun/unmaintain.html Thank you! 35