Code Correctness, Readability, Maintainability Telerik Software Academy Telerik School.

Slides:



Advertisements
Similar presentations
Revealing the Secrets of Self-Documenting Code Svetlin Nakov Telerik Corporation For C# Developers.
Advertisements

Introduction to Unit Testing Svetlin Nakov Telerik Corporation
Code Correctness, Readability, Maintainability Svetlin Nakov Telerik Corporation
Test Automation: Coded UI Test
Coding Standard: General Rules 1.Always be consistent with existing code. 2.Adopt naming conventions consistent with selected framework. 3.Use the same.
What is Unit Testing? How TDD Works? Tsvyatko Konov Telerik Corporation
Written by: Dr. JJ Shepherd
Software Engineering and Design Principles Chapter 1.
Introduction to Refactoring Excerpted from ‘What is Refactoring?’ by William C. Wake and Refactoring: Improving the Design of Existing Code by Martin Fowler.
Chapter 1 Principles of Programming and Software Engineering.
Unit testing C# classes “If it isn’t tested it doesn’t work” Unit testing C# classes1.
© 2006 Pearson Addison-Wesley. All rights reserved2-1 Chapter 2 Principles of Programming & Software Engineering.
Telerik Software Academy Software Quality Assurance.
Creating and Running Your First C# Program Telerik Software Academy Telerik School Academy.
Unit Testing & Defensive Programming. F-22 Raptor Fighter.
Lecture 6 Software Testing and jUnit CS140 Dick Steflik.
1 Shawlands Academy Higher Computing Software Development Unit.
Planning and Tracking Software Quality.  What Is Software Quality?  Causes of Software Defects  What is Quality Assurance?  Improving the Software.
Unit and Functional Testing Your Flex Applications Mike Nimer Dir. Of Engineering nomee.com.
Unit Testing and Mocking
Course Introduction Svetlin Nakov Telerik Corporation
CMSC 202 Exceptions. Aug 7, Error Handling In the ideal world, all errors would occur when your code is compiled. That won’t happen. Errors which.
Building Rock-Solid Software Nikolay Kostov Telerik Software Academy academy.telerik.com Senior Software Developer and Technical Trainer
Sadegh Aliakbary Sharif University of Technology Spring 2012.
T-unit: Tcl Unit Test Package Automated Unit Test Package For Tcl Procedures Final Presentation Joseph Boyle Loyola Marymount University.
CSE 219 Computer Science III Testing. Testing vs. Debugging Testing: Create and use scenarios which reveal incorrect behaviors –Design of test cases:
1 The Software Development Process  Systems analysis  Systems design  Implementation  Testing  Documentation  Evaluation  Maintenance.
07 Coding Conventions. 2 Demonstrate Developing Local Variables Describe Separating Public and Private Members during Declaration Explore Using System.exit.
High-Quality Programming Code Code Correctness, Readability, Maintainability, Testability, Etc. SoftUni Team Technical Trainers Software University
Quality Code academy.zariba.com 1. Lecture Content 1.Software Quality 2.Code Formatting 3.Correct Naming 4.Documentation and Comments 5.Variables, Expressions.
When and How to Refactor? Refactoring Patterns Alexander Vakrilov Telerik Corporation Senior Developer and Team Leader.
Improving the Quality of Existing Code Svetlin Nakov Telerik Corporation
Code Correctness, Readability, Maintainability Svetlin Nakov Telerik Software Academy academy.telerik.com Technical Trainer
Unit Testing Building Rock-Solid Software SoftUni Team Technical Trainers Software University
Best Practices. Contents Bad Practices Good Practices.
C# EMILEE KING. HISTORY OF C# In the late 1990’s Microsoft recognized the need to be able to develop applications that can run on multiple operating system.
A Practical Guide To Unit Testing John E. Boal TestDrivenDeveloper.com.
Advanced Programming in Java
Unit Testing with JUnit and Clover Based on material from: Daniel Amyot JUnit Web site.
Course Program, Evaluation, Exams, Resources Svetlin Nakov Telerik Software Academy academy.telerik.com Technical Trainer
The Software Development Process
Sadegh Aliakbary Sharif University of Technology Spring 2011.
© 2006 Pearson Addison-Wesley. All rights reserved2-1 Chapter 2 Principles of Programming & Software Engineering.
© 2006 Pearson Addison-Wesley. All rights reserved 2-1 Chapter 2 Principles of Programming & Software Engineering.
Software Engineering and Object-Oriented Design Topics: Solutions Modules Key Programming Issues Development Methods Object-Oriented Principles.
Design and Planning Or: What’s the next thing we should do for our project?
Unit Testing in JavaScript with Mocha, Chai and Karma SoftUni Team Technical Trainers Software University
SEG 4110 – Advanced Software Design and Reengineering Topic T Introduction to Refactoring.
Unit Testing Building Rock-Solid Software Svetlin Nakov Technical Trainer Software University
High-Quality Programming Code Code Correctness, Readability, Maintainability Svetlin Nakov Technical Trainer Software University
PROGRAMMING TESTING B MODULE 2: SOFTWARE SYSTEMS 22 NOVEMBER 2013.
Pertemuan 12 Refactoring Mata kuliah: T0144 – Advanced Topics in Software Engineering Tahun: 2010.
Programming & Debugging. Key Programming Issues Modularity Modifiability Ease of Use Fail-safe programming Style Debugging.
C# Fundamentals An Introduction. Before we begin How to get started writing C# – Quick tour of the dev. Environment – The current C# version is 5.0 –
Chapter 10 Software quality. This chapter discusses n Some important properties we want our system to have, specifically correctness and maintainability.
Northwest Arkansas.Net User Group Jay Smith Tyson Foods, Inc. Unit Testing nUnit, nUnitAsp, nUnitForms.
High-Quality Programming Code Code Correctness, Readability, Maintainability, Testability, Etc. SoftUni Team Technical Trainers Software University
Principles of Programming & Software Engineering
Building Rock-Solid Software
Mocking Tool for easier unit testing
Chapter - 8 Implementation.
Introduction to Unit Testing in JavaScript
Chapter 8 – Software Testing
Principles of Programming and Software Engineering
Unit testing C# classes
Computer Programming.
Software Quality Engineering
Component Testing (Unit Testing)
CMSC 202 Exceptions.
Chapter 9: Implementation
Presentation transcript:

Code Correctness, Readability, Maintainability Telerik Software Academy Telerik School Academy

 Why Quality Is Important?  Software Quality: External and Internal  What is High-Quality Code?  Code Conventions  Managing Complexity  Characteristics of Quality Code  Unit Testing  Recommended Books 2

What does this code do? Is it correct? 4 static void Main() { int value=010, i=5, w; int value=010, i=5, w; switch(value){case 10:w=5;Console.WriteLine(w);break;case 9:i=0;break; switch(value){case 10:w=5;Console.WriteLine(w);break;case 9:i=0;break; case 8:Console.WriteLine("8 ");break; case 8:Console.WriteLine("8 ");break; default:Console.WriteLine("def ");{ default:Console.WriteLine("def ");{ Console.WriteLine("hoho ");} Console.WriteLine("hoho ");} for (int k = 0; k < i; k++, Console.WriteLine(k - 'f'));break;} { Console.WriteLine("loop!"); } for (int k = 0; k < i; k++, Console.WriteLine(k - 'f'));break;} { Console.WriteLine("loop!"); }}

Now the code is formatted, but is still unclear. 5 static void Main() { int value = 010, i = 5, w; int value = 010, i = 5, w; switch (value) switch (value) { case 10: w = 5; Console.WriteLine(w); break; case 10: w = 5; Console.WriteLine(w); break; case 9: i = 0; break; case 9: i = 0; break; case 8: Console.WriteLine("8 "); break; case 8: Console.WriteLine("8 "); break; default: default: Console.WriteLine("def "); Console.WriteLine("def "); Console.WriteLine("hoho "); Console.WriteLine("hoho "); for (int k = 0; k < i; k++, for (int k = 0; k < i; k++, Console.WriteLine(k - 'f')) ; Console.WriteLine(k - 'f')) ; break; break; } Console.WriteLine("loop!"); Console.WriteLine("loop!");}

 External quality  Does the software behave correctly?  Are the produced results correct?  Does the software run fast?  Is the software UI easy-to-use?  Is the code secure enough?  Internal quality  Is the code easy to read and understand?  Is the code well structured?  Is the code easy to modify? 6

 High-quality programming code:  Easy to read and understand  Easy to modify and maintain  Correct behavior in all cases  Well tested  Well architectured and designed  Well documented [click for fun] click for funclick for fun  Self-documenting code  Well formatted 7

 High-quality programming code:  Strong cohesion at all levels: modules, classes, methods, etc.  Single unit is responsible for single task  Loose coupling between modules, classes, methods, etc.  Units are independent one of another  Good formatting  Good names for classes, methods, variables, etc.  Self-documenting code style 8

 Code conventions are formal guidelines about the style of the source code:  Code formatting conventions  Indentation, whitespace, etc.  Naming conventions  PascalCase or camelCase, prefixes, suffixes, etc.  Best practices  Classes, interfaces, enumerations, structures, inheritance, exceptions, properties, events, constructors, fields, operators, etc. 10

 Microsoft has official C# code conventions  Design Guidelines for Developing Class Libraries:  Semi-official JavaScript code conventions  styleguide.googlecode.com/svn/trunk/javascriptguide.xml styleguide.googlecode.com/svn/trunk/javascriptguide.xml styleguide.googlecode.com/svn/trunk/javascriptguide.xml  Large organization follow strict conventions  Code conventions can vary in different teams  High-quality code goes beyond code conventions  Software quality is a way of thinking! 11

 Managing complexity has central role in software construction  Minimize the amount of complexity that anyone’s brain has to deal with at certain time  Architecture and design challenges  Design modules and classes to reduce complexity  Code construction challenges  Apply good software construction practices: classes, methods, variables, naming, statements, error handling, formatting, comments, etc. 13

 Key to being an effective programmer:  Maximizing the portion of a program that you can safely ignore  While working on any one section of code  Most practices discussed later propose ways to achieve this important goal 14

 Correct behavior  Conforming to the requirements  Stable, no hangs, no crashes  Bug free – works as expected  Correct response to incorrect usage  Readable – easy to read  Understandable – self-documenting  Maintainable – easy to modify when required 16

 Good identifiers' names  Good names for variables, constants, methods, parameters, classes, structures, fields, properties, interfaces, structures, enumerations, namespaces,  High-quality classes, interfaces and class hierarchies  Good abstraction and encapsulation  Simplicity, reusability, minimal complexity  Strong cohesion, loose coupling 17

 High-quality methods  Reduced complexity, improved readability  Good method names and parameter names  Strong cohesion, loose coupling  Variables, data, expressions and constants  Minimal variable scope, span, live time  Simple expressions  Correctly used constants  Correctly organized data 18

 Correctly used control structures  Simple statements  Simple conditional statements and simple conditions  Well organized loops without deep nesting  Good code formatting  Reflecting the logical structure of the program  Good formatting of classes, methods, blocks, whitespace, long lines, alignment, etc. 19

 High-quality documentation and comments  Effective comments  Self-documenting code  Defensive programming and exceptions  Ubiquitous use of defensive programming  Well organized exception handling  Code tuning and optimization  Quality code instead of good performance  Code performance when required 20

 Following the corporate code conventions  Formatting and style, naming, etc.  Domain-specific best practices  Well tested and reviewed  Testable code  Well designed unit tests  Tests for all scenarios  High code coverage  Passed code reviews and inspections 21

 You have already done unit testing  Manually, by hand  Manual tests are less efficient  Not structured  Not repeatable  Not on all your code  Not easy to do as it should be 23

 Tests are specific pieces of code  In most cases unit tests are written by developers, not by QA engineers  Unit tests are released into the code repository (TFS / SVN / Git) along with the code they test  Unit testing framework is needed  Visual Studio Team Test (VSTT)  NUnit, MbUnit, Gallio, etc. 24

 All classes should be tested  All methods should be tested  Trivial code may be omitted  E.g. property getters and setters  Private methods can be omitted  Some gurus recommend to never test private methods  this can be debatable  Ideally all unit tests should pass before check- in into the source control repository 25

 Unit tests dramatically decrease the number of defects in the code  Unit tests improve design  Unit tests are good documentation  Unit tests reduce the cost of change  Unit tests allow refactoring  Unit tests decrease the defect-injection rate due to refactoring / changes  Prevent bugs from happening again 26

 Team Test (VSTT) is very well integrated with Visual Studio  Create test projects and unit tests  Execute unit tests  View execution results  View code coverage  Located in the assembly Microsoft.VisualStudio.QualityTools. UnitTestFramework.dll 27

 Test code is annotated using custom attributes:  [TestClass] – denotes a class holding unit tests  [TestMethod] – denotes a unit test method  [ExpectedException] – test causes an exception  [Timeout] – sets a timeout for test execution  [Ignore] – temporary ignored test case  [ClassInitialize], [ClassCleanup] – setup / cleanup logic for the testing class  [TestInitialize], [TestCleanup] – setup / cleanup logic for each test case 28

 Assertions check a condition  Throw exception if the condition is not satisfied  Comparing values for equality  Comparing objects (by reference)  Checking for null value 29 AreEqual(expected_value, actual_value [,message]) AreSame(expected_object, actual_object [,message]) IsNull(object [,message]) IsNotNull(object [,message])

30 public class Account { private decimal balance; private decimal balance; public void Deposit(decimal amount) public void Deposit(decimal amount) { this.balance += amount; this.balance += amount; } public void Withdraw(decimal amount) public void Withdraw(decimal amount) { this.balance -= amount; this.balance -= amount; } public void TransferFunds( public void TransferFunds( Account destination, decimal amount) Account destination, decimal amount) { … } { … } public decimal Balance public decimal Balance { … } { … }}

31 using Microsoft.VisualStudio.TestTools.UnitTesting; [TestClass] public class AccountTest { [TestMethod] [TestMethod] public void TransferFunds() public void TransferFunds() { Account source = new Account(); Account source = new Account(); source.Deposit(200.00M); source.Deposit(200.00M); Account dest = new Account(); Account dest = new Account(); dest.Deposit(150.00M); dest.Deposit(150.00M); source.TransferFunds(dest, M); source.TransferFunds(dest, M); Assert.AreEqual(250.00M, dest.Balance); Assert.AreEqual(250.00M, dest.Balance); Assert.AreEqual(100.00M, source.Balance); Assert.AreEqual(100.00M, source.Balance); }}

Live Demo

Code Complete, 2nd Edition, Steve McConnell, ISBN , Refactoring: Improving the Design of Existing Code, Martin Fowler, Kent Beck, John Brant, William Opdyke, Don Roberts, ISBN , Test Driven Development: By Example, Kent Beck, ISBN

Questions?

 C# Telerik Academy  csharpfundamentals.telerik.com csharpfundamentals.telerik.com  Telerik Software Academy  academy.telerik.com academy.telerik.com  Telerik Facebook  facebook.com/TelerikAcademy facebook.com/TelerikAcademy  Telerik Software Academy Forums  forums.academy.telerik.com forums.academy.telerik.com