Software Reengineering
By
Dr. Junaid Akram
Assistant Professor, Department of Computer Science COMSATS (Lahore)
Software Maintenance
( Code Smells )
2
J.A COMSATS Uni
3
Smells
4
Concepts and Definitions
Examples of Code smells
Research on code smells
State of the Art
Outline
Code smells detection techniques
Evaluation of technique
Conclusion
Code Smells
Flower et al[4] identified 22 code smells in 1999.
Code Smells are usually implementation problems.
It is claimed that classes that are involved in certain
code smells are liable to be changed more frequently
and have more defects than other classes in the
code[2]
God Class, Data Class, Long method parameters,
Feature envy etc. are code smells
Code smell is any symptom that indicating
something wrong
Code smell is actually a hint that something has
Code Smells gone wrong somewhere in your code which may
cause problems
Definitions
Code Smells are structural characteristics of
software that may indicate a code or design
problem that makes software hard to evolve and
maintain, and may trigger refactoring of code
Why Cod Smells Occur?
Frequent changes and enhancement
Violation of standard design and coding principles
Deadline Pressure
Priority to features over quality
Inexperience of developers
In-appropriate Refactoring operations
Poor human resource planning
Framework constraints etc.
• Successful systems are maintained over
multiple years
• Exceeding size and complexity are problem for
evolution and maintenance
Motivation • System’s Life-Cycle Properties worsen over
time
for Code • Understandability
Smells •
•
Testability
Extensibility
• Reusability
• Restructuring/Refactoring helps to improve
life-cycle properties
• Code Smells
Summary of Code Smells
Large
Class
A class is trying to do too much. These classes
have too many instance variables or methods.
Large Class
• A large class has monopoly on entire application
• Some methods belong to other classes
Large Class
J.A COMSATS Uni
Long Method
• Long Method is a method that is too long, so it is difficult to
understand, change, or extend
• Still, no hard and fast rules about size.
• Cyclomatic Complexity metrics can be used to detect long methods
from code.
• Detection rule may be:
ümore than or equals to a specified number of Lines of code (excluding
method declaration, comments and parenthesis) or
ümore than or equals to a specified number of Operands and (or) Operators
Data Class
• These are Classes that have fields, getting and setting methods and
nothing else
• Is just acting as a data holder
• Can indicate the design is really procedural
• Detection rules will be as:
üIf the class contains public attributes and no methods the smell is detected;
üIf the class contains only get and set methods the smell is detected
Duplicate Code
• Percentage of duplicate code lines in the systems
• Duplicate methods in subclasses
• Duplicate expressions in same class
• Duplicate expressions in different classes
Example:
sqrt(pow(loc1.getX() - loc2.getX(), 2)+
pow(loc1.getY() - loc2.getY(), 2))
sqrt(square(loc1.getX() - loc2.getX())+
square(loc1.getY() - loc2.getY()))
double square(double d) {
return pow(d, 2);
}
J.A COMSATS Uni
Duplicate Code
>"#A%CCCDEFGHI-KLMGHNCCCC >"gN%CCCDEFGHI-KLMGHNCCCC >"oN%CCCDEFGHI-KLMGHNCCCC
>"##%CCCOP4RSTPUG9:;<<=[SNRS?UR9[]UAES_TUC>"gn%CCCOP4RSTPUG9:;<<E[SNRS?UR9[]4PUASCUAES_TUC >"on%CCCOP4RSTPUG9:;<<=[SNP_S]UAES_TUCwCRNP_Sp
>"#"%CCCa >"go%CCCa >"oo%CCCa
>"#b%CCCCCUAcdSPES_TUCC?_[ef >"NT%CCCCCUAcdSPES_TUCC?_[ef >bTT%CCCCCUAcdSPES_TUCC?_[ef
>"#g%CCCCCUAGhiGCMd_;f >"Nr%CCCCCUAGhiGCMd_;f >bTr%CCCCCUAGhiGCMd_;f
>"#N%CCCCCUA_[Ad;SC_[Ad;SClCDEFLmf >"NA%CCCCCUA_[Ad;SC_[Ad;SClCDEFLmf >bTA%CCCCCUA_[Ad;SC_[Ad;SClCDEFLmf
>"#n%CCCCC >"N#%CCC >bT#%CCCCC
>"#o%CCCCC_[Ad;SClC=[SK_[e]?_[epf >"N"%CCCCC_[Ad;SClC=[SK_[e]?_[epf >bT"%CCCCC_[Ad;SClC=[SK_[e]?_[epf
>""T%CCCCCTeC]DEFLmCllC_[Ad;SpCa >"Nb%CCCCCTeC]DEFLmCllC_[Ad;SpCa >bTb%CCCCCTeC]DEFLmCllC_[Ad;SpCa
>""r%CCCsTeUt[eCDIumL >"Ng%CCCsTeUt[eCDIumL >bTg%CCCsTeUt[eCDIumL
>""A%CCCCCCC_[Ad;SClCDEFD[vhiO]wd_;[C?_[epf >"NN%CCCCCCC_[Ad;SClCDEFD[vhiO]wd_;[C?_[epf >bTN%CCCCCCC_[Ad;SClCDEFD[vhiO]wd_;[C?_[epf
>""#%CCCs[;A[ >"Nn%CCCs[;A[ >bTn%CCCs[;A[
>"""%CCCCCCC_[Ad;SClCDEFD[vhiG]wd_;[C?_[epf >"No%CCCCCCC_[Ad;SClCDEFD[vhiG]wd_;[C?_[epf >bTo%CCCCCCC_[Ad;SClCDEFD[vhiG]wd_;[C?_[epf
>""b%CCCs[UtTeC\\CDIumL >"nT%CCCs[UtTeC\\CDIumL >brT%CCCs[UtTeC\\CDIumL
>""g%CCCCCCCTeC]DEFLmCllC_[Ad;SpCa >"nr%CCCCCCCTeC]DEFLmCllC_[Ad;SpCa >brr%CCCCCCCTeC]DEFLmCllC_[Ad;SpCa
>""N%CCCsTet[eCDIumL >"nA%CCCCCCCCC4?R_CMbdeClCRNRS?UR9[}-PD[vuES_TUC]pf>brA%CCCCCCCCCRNP_S}E[SO[UCS?]Tpf
>""n%CCCCCCCCC4?R_MCeT;[f >"n#%CCCsTet[eCDIumL >br#%CCCsTet[eCDIumL
>""o%CCCCCCCCC_[Ad;SClCd_;]{=[SNRS?]weT;[pf >"n"%CCCCCCCCCd_;]{E[SNRS?]bdepf >br"%CCCCCCCCCNiGUS#AC:P_Sf
>"bT%CCCs[;A[ >"nb%CCCs[;A[ >brb%CCCCCCCCC]cPTtpd_;]{=[SNP_S]w:P_Spf
>"br%CCCCCCCCC4PUASC4?R_MCeT;[f >"ng%CCCCCCCCCd_;]{E[S_T;[]bdepf >brg%CCCs[;A[
>"bA%CCCCCCCCC_[Ad;SClCd_;]{=[S_T;[]weT;[pf >"nN%CCCs[UtTe >brN%CCCCCCCCCNihTUS#AC:P_Sf
>"b#%CCCs[UtTe >"nn%CCCCCCCCCE[ShiO]d_;pf >brn%CCCCCCCCC]cPTtpd_;]{=[SKPASNP_S]w:P_Spf
>"b"%CCCCCCCCCTeC]_[Ad;SCllCDEFLmpCa >"no%CCCCCCCCCt[;[S[>%Cbdef >bro%CCCs[UtTe
>"bb%CCCCCCCCCCCRNRS?UR9[}E[SES_TUC]eT;[pf >"oT%CCCCCCCCCDEFiIOIcEI]d_;pfCCCCCC >bAT%CCCCCCCCCTeC]]rCdlC:P_SpCa
>"bg%CCCsTet[eCDIumL >"or%CCCCCCCa >bAr%CCCCCCCCCCCRNP_S}c::[Ut]:P_S[CrTpf
>"bN%CCCCCCCCCCCUAui-<<e_[[]eT;[pf >"oA%CCCCCa >bAA%CCCCCCCCCa
>"bn%CCCs[UtTe >"o#%CCC >bA#%CCCCCCCCCDEFiIOIcEI]d_;pf
>"bo%CCCCCCCCCa >"o"%CCCCC_[Sd_UC_[Ad;Sf >bA"%CCCCCCCa
>"gT%CCCCCCCCCDEFG_FiIOIcEI]d_;pf >"ob%CCCa >bAb%CCCCCa
>"gr%CCCCCCCa >"og%C >bAg%CCC
>"gA%CCCCCa >bAN%CCCCC_[Sd_UC_[Ad;Sf
>"g#%CCC >bAn%CCCa
>"g"%CCCCC_[Sd_UC_[Ad;Sf >bAo%
>"gb%CCCa
>"gg%C
Code Clones
Type-1 Code Clone: Identical code fragments except for differences in whitespace, layout, and
comments.
Type-2 Code Clone:Code fragments that are identical except for variations in identifier names and
literal values, in addition to differences in whitespace, layout, and comments
Type-3 Code Clone: Code fragments with further modifications such as changes in statements, which
may involve adding or removing statements, but retain similar functionality.
Type-4 Code Clone: Code fragments that are semantically similar but syntactically different. This
means they perform the same functionality but are written in different ways.
19
Types of Clones
J.A COMSATS Uni
Message Chain
• Long list of method calls:
• Can be analyzed by Measuring the couplings of a method
• customer.getAddress().getState()
• window.getBoundingbox().getOrigin().getX()
• Replace with shorter calls:
• customer.getState()
• window.leftBoundary()
Long Parameters List
• A long parameter list exists if
• a method contains more than or equals to a specified number of parameters.
The specific (threshold) value for the number of parameters is given by the user
or ; (PMD uses 10 as specified threshold while for Check Style it is 7)
• if it contains two or more (specified numbers of) parameter of same primitive
data type.
J.A COMSATS Uni
Research on code smells
Very active research area
There are many studies published on detection and refactoring of code
smells
Due to large body of knowledge, there are many published surveys, mapping
studies and systematic review studies on the topic
There is a recent secondary study
Research in
Code Smells
Zakeri-Nasrabadi, Morteza, et al. "A systematic literature review on the code smells datasets and validation
mechanisms." ACM Computing Surveys 55.13s (2023): 1-48.
Zakeri-Nasrabadi,
Morteza, et al. "A
systematic literature
review on the code
smells datasets and
validation
mechanisms." ACM
Computing
Surveys 55.13s (2023):
1-48.
Research in Code Smells
Pereira dos Reis, José, et al. "Code smells detection and visualization: a systematic literature
review." Archives of Computational Methods in Engineering 29.1 (2022): 47-94.
26
J.A COMSATS Uni
Research in Code Smells
Pereira dos Reis, José,
et al. "Code smells
detection and
visualization: a
systematic literature
review." Archives of
Computational Methods
in Engineering 29.1
(2022): 47-94.
27
Programming languages and number of
studies that use them
28
Conclusion
Software Refactoring and Maintenance is heavily based on the detection of Code
Smells.
Detection tools for the detection of different Code Smells from multiple
languages is missing.
There is disparity in results of different tools
Standard benchmarks are highly desired
The impacts of Code Smells is heavily based on accurate detection of all
different code smells.
More focus is required on refactoring techniques and tools
J.A COMSATS Uni
Thanks for your attention!
Any Question?
Email me on : junaidakram@cuilahore.edu.pk 30