530 likes | 755 Vues
Advanced Programming in Java. Sadegh Aliakbary. Review. Java Programming Language Principles of Object Oriented Programming Characteristics of objects Encapsulation Objects in memory References Heap Stack Parameter Passing. Review (2). Initialization and Cleanup Constructor
E N D
Advanced Programming in Java SadeghAliakbary
Review • Java Programming Language • Principles of Object Oriented Programming • Characteristics of objects • Encapsulation • Objects in memory • References • Heap • Stack • Parameter Passing Sharif University of Technology
Review (2) • Initialization and Cleanup • Constructor • finalize() • Order of initialization • Initialization blocks • Access specifiers • Public • Private • Package access Sharif University of Technology
Review (3) • Package • Static • The this reference • Method overloading • toString() • equals() • Refactoring • Bad smells • Refactoring techniques Sharif University of Technology
Agenda • Software Quality • Characteristic of a good software • Test • Unit Testing • Refactoring Sharif University of Technology
Quality of Product • The producer should ensure about the quality of the products • Quality Control • Any business, any product Sharif University of Technology
A Cook Sharif University of Technology
In surgery Sharif University of Technology
A Car Maker Sharif University of Technology
Quality Control • Quality should be tested • A product is not finalized, before the test • Different kinds of test, check different kinds of quality Sharif University of Technology
Software Quality • We are programmers • Programmers produce software • What are characteristics of a good software? • Many parameters. E.g. • Conformance to requirements • Performance • Time • Memory • Maintainability • Changeability • Different kinds of test, check different kinds of quality Sharif University of Technology
Test in Other Industries • Test side effects • A damage to the product • Test of a building • Test of a car • Test of a part of a product Sharif University of Technology
Test Side Effects Sharif University of Technology
What to do with Test Side Effects? • Testing a sample of the product • Simulation • Mathematical analysis • In software testing • Along with all of these techniques • And we can also test the software itself! • (Usually) no damage to the software Sharif University of Technology
Test Target • System Test • Test the system as a whole • For performance, correctness and conformance. • Unit Test • Test the units and modules • Test of a component • Test of a class • Test of a method Sharif University of Technology
How to Test Software • Manual Test • Try it! • Test Tools • Performance Test • Profiling • JProfiler, TPTP • Load Test • Jmeter • Test Code • Unit Tests • Test Teams Sharif University of Technology
Test Code • Business Code • The code, written for implementation of a requirement • Test Code • The code, written for test of an implementation Sharif University of Technology
Unit Testing • A process for the programmer • Not a test team procedure • For improving the code quality • Reduces bugs • Test of units of software • before the software is completed • Unit: method, class Sharif University of Technology
Classical Unit Testing • Writing main() method • Some printlns • Drawbacks? Sharif University of Technology
Drawbacks • Test code coupled with business code • In the same class • Written tests are discarded • One test at a time • The programmer executes the tests himself • Test execution is not automatic • The programmer should check the result of each test himself • The test is passed or failed? • The test result interpretation is not automatic Sharif University of Technology
A Good Unit Test Code • Repeatable • Automatic • Invocation • Acceptance (Pass/Failure) • JUnit helps you write such tests Sharif University of Technology
JUnit, First Example Sharif University of Technology
JUnit, The Green Bar Sharif University of Technology
publicclass Testing { @Test publicvoidtestNormal() { int[] array = {3,2,1,4}; int[] sorted = {1,2,3,4}; Business.sort(array); for (inti = 0; i < sorted.length; i++) { Assert.assertEquals(sorted[i], array[i]); } } @Test publicvoidtestEmptyArray() { int[] array = {}; try{ Business.sort(array); }catch(Exception e){ Assert.fail(); } Assert.assertNotNull(array); Assert.assertEquals(array.length, 0); } } Sharif University of Technology
Assertions • assertNull(x) • assertNotNull(x) • assertTrue(boolean x) • assertFalse(boolean x) • assertEquals(x, y) • Uses x.equals(y) • assertSame(x, y) • Uses x ==y • assertNotSame • fail() Sharif University of Technology
Annotations • @Test • @Before • @After • @BeforeClass • @AfterClass Sharif University of Technology
A Good Unit Test is • Automated • Through • Repeatable • Independence • Professional Sharif University of Technology
Test Driven Development • Test First Development • Before writing a code, write the tests! Sharif University of Technology
TDD Sharif University of Technology
Refactoring • A disciplined way to restructure code • In order to improve code quality • Without changing its behavior • a change made to the internal structure of software to make it easier to understand and cheaper to modify without changing its observable behavior. Martin Fowler Sharif University of Technology
Refactoring • Refactoring is the process of changing a software system • In such a way that it does not alter the external behavior of the code • But improves its internal structure • It is a disciplined way to clean up code • It minimizes the chances of introducing bugs • When you refactor, you are improving the design of the code after it has been written. Martin Fowler Sharif University of Technology
Refactoring • By continuously improving the design of code, we make it easier and easier to work with Joshua Kerievsky, Refactoring to Patterns Sharif University of Technology
Example • Duplicate Code • What are the drawbacks? • What is the solution? • Refactoring: • Finding a “Bad Smell” • Changing the code to remove the bad smell • Some well-known bad smells are reported Sharif University of Technology
Bad Smell • A bad smell in code • Any symptom in the source code that possibly indicates a deeper problem. • The term is coined by Kent Beck. Sharif University of Technology
Bad Smells • If it stinks, change it! • Kent Beck and Martin Fowler. • Bad smells in code • Bad smells are source of problems • Remove bad smells • How? • By Refactoring Sharif University of Technology
Bad Smells • Duplicated Code • Long Method • Large Class • Long Parameter List • … Sharif University of Technology
Refactoring Techniques • Extract Method • Move • Method • Variable • Class • Extract Class • Rename • Method • Variable • Class • Pull Up • Push Down Sharif University of Technology
IDE Support • Refactoring techniques are widely supported by IDEs • Practice it in Eclipse Sharif University of Technology
The Two Hats • Kent Beck's metaphor of two hats • Divide your time between two distinct activities • adding function • refactoring Sharif University of Technology
Why Should I Refactor? • Refactoring Improves the Design of Software • Refactoring Makes Software Easier to Understand • Refactoring Helps You Find Bugs • Refactoring Helps You Program Faster • Refactoring makes your code more maintainable Sharif University of Technology
When Should You Refactor? • The Rule of Three: • Refactor When You Add Function • Refactor When You Need to Fix a Bug • Refactor As You Do a Code Review Sharif University of Technology
Scanner s = new Scanner(System.in); System.out.println("Rectangle Info."); System.out.print("Enter the width: "); int a1 = s.nextInt(); System.out.print("Enter the length: "); int a2 = s.nextInt(); System.out.println("Rectangle Info."); System.out.print("Enter the width: "); int b1 = s.nextInt(); System.out.print("Enter the length: "); int b2 = s.nextInt(); intx = a1*a2; inty = b1*b2; if(x == y) System.out.println("Equal"); Find bad smells! Refactor the Code! Sharif University of Technology
Scanner scanner = new Scanner(System.in); System.out.println("Rectangle Info."); System.out.print("Enter the width: "); int width1 = scanner.nextInt(); System.out.print("Enter the length: "); int length1 = scanner.nextInt(); System.out.println("Rectangle Info."); System.out.print("Enter the width: "); int width2 = scanner.nextInt(); System.out.print("Enter the length: "); int length2 = scanner.nextInt(); int area1 = width1*length1; int area2 = width2*length2; if(area1 == area2) System.out.println("Equal"); Rename… Sharif University of Technology
class Rectangle{ privateintlength , width; publicintgetLength() { returnlength; } publicvoidsetLength(int length) { this.length= length; } publicintgetWidth() { returnwidth; } publicvoidsetWidth(int width) { this.width= width; } publicRectangle(int length, int width) { this.length= length; this.width= width; } } Extract Class… Sharif University of Technology
Scanner scanner = new Scanner(System.in); System.out.println("Rectangle Info."); System.out.print("Enter the width: "); int width = scanner.nextInt(); System.out.print("Enter the length: "); int length = scanner.nextInt(); Rectangle rectangle1 = new Rectangle(length, width); System.out.println("Rectangle Info."); System.out.print("Enter the width: "); width = scanner.nextInt(); System.out.print("Enter the length: "); length = scanner.nextInt(); Rectangle rectangle2 = new Rectangle(length, width); int area1 = rectangle1.getWidth()*rectangle1.getLength(); int area2 = rectangle2.getWidth()*rectangle2.getLength(); if(area1 == area2) System.out.println("Equal"); Sharif University of Technology
class Rectangle{ ... publicint area(){ returnlength * width; } } … int area1 = rectangle1.area(); int area2 = rectangle2.area(); Extract Method… Sharif University of Technology
privatestatic Rectangle readRectangle(Scanner scanner) { intwidth; intlength; System.out.println("Rectangle Info."); System.out.print("Enter the width: "); width = scanner.nextInt(); System.out.print("Enter the length: "); length = scanner.nextInt(); Rectangle rectangle2 = new Rectangle(length, width); returnrectangle2; } Extract Method… Sharif University of Technology
Refactored Code Scanner scanner = new Scanner(System.in); Rectangle rectangle1 = readRectangle(scanner); Rectangle rectangle2 = readRectangle(scanner); int area1 = rectangle1.area(); int area2 = rectangle2.area(); if(area1 == area2) System.out.println("Equal"); Sharif University of Technology