Giter Club home page Giter Club logo

algorithemic-complexity-calculator's Introduction

Algorithemic Complexity Calculator (ACC)

Introduction

Complexity of a code base is a measure of the quality of the code that the programmer writes it help to see vulnerabilities, duplication happen in code and help to reduce the redeclaration of variables in a program. So, since it’s a very import aspect to every programmer to verify the code quality of his/her code base we have made it easy through our solution. Although there are many complexity measure tools exists most of them don not have the ability to calculate the complexity when a folder structure containing list of files is scanned and apart from that our solution show the complexity details of the each and every line in all the files which will help the programmer to identify where he/she can reduce the complexity of the program. When we see from the programmer point of view, he is always occupied with programming most of the time so we have implemented a special feature which will able to track the history of the files that are scanned. So that once the programmer modified and scanned the code base again, he can compare the complexity differences in the code before modifying and after modifying. We have displayed the Code base differences via Bar chart so that programmer can get a clear understanding of the differences.

The key concepts in the our solution that made our solution a unique tool when compared to other products in the market. In our design we are finding total complexities as result of the occurrence of following complexities,

       a) complexity due to inheritance.
       b) complexity due to Size.
       c) complexity due to Nesting Levels.
       d) complexity due to Control Structures.
       e) complexity due to Recursion.

System Components

The Algorithmic Complexity Calculator (ACC) contains three major components, ACC scanner, ACC engine and a web client. It currently supports two languages Java and C.


Capture7

Figure_1: component diagram


ACC scanner does the complexity calculation process. At last the generated output will send as a post API request to ACC engine. The ACC engine inserts the requested values into the database. End user can use the web client to view the current progress and historical records about the scanned projects.

A. ACC Scanner

Purely the ACC scanner has implemented in Java oriented technologies. The scanner includes three major services.

      • Recursive file reader.
      • Complexity estimator.
      • Complexity feeding plugin.

Once a project has submitted to the recursive file reader, the service will recursively go through the project folders and read files. While the process reads the code line by line from the beginning.

The recursive file reader prepares a list and finally passes to the complexity estimator.

Complexity estimator will estimate the complexity of lines as per the internal algorithm. Algorithm uses source code to generate complexity. All commented lines will be ignored by the process. This process measures four types of complexities and finally combines them. Below are the different types of complexities we are measuring.

      a) Size complexity.
      b) Type and the nesting level of control structures complexity.
      c) Inheritance complexity.
      d) Recursion complexity.

The final complexity value will be generated using these complexities. Finally, all these complexity values parsed to the complexity feeding plugin.

Complexity feeding plugin will generate a JSON request relevant to the passed line data. At last JSON request will be sent to ACC backend.

B. ACC Engine

ACC backend engine is developed using Java technology with the spring boot framework. Engine act in two ways, according to the request, it will either return project details or insert request details to the database. ACC engine contains three layers.

      • Controller layer.
      • Service layer.
      • Repository layer.

Controller layer receives requests coming from ACC scanner, while receiving it will validate the request body and generate an entity object. Then this object will pass to the Service layer for further processing.

Once service layer received the request entity object it will add additional important values such as created time to the entity object. Then it will pass to the repository layer.

When repository layer received an entity object it will insert that object as a JSON document to the configured MongoDB database.

C. ACC Web Client

ACC web client is developed using ReactJS technology. The web client provide below features.

      • Show a comparison about project complexities.
      • Show project history in graphical view.
      • File wise complexity comparison.
      • Decide project status.

When loading the home screen it will fetch all projects from ACC engine. Then, it will display all projects with relevant project complexity. Users can compare projects in this view.

Inside the project view, it will display a graphical view of project history. In this graph, there is a comparison of the last six analysis results.

Inside the project view, it will display the complexity per file. Also, once a user selects a file, the user can view the line by line complexity.

There is a quality gate that uses the complexity values of all the files. Using an internal algorithm currently, it will display the pass or fail status of a particular project.


Capture7

Figure_2: acc client dashboard


Capture7

Figure_3: file complexity


Capture7

Figure_4: line complexity


Capture7

Figure_5: analysis history


Complexity Calculation Methodology

Measuring the complexity of a program statement due to size (Cs)

➢ A constant value of two is added to ‘Cs’ at the detection of the following:

      ▪ Reference (&) and dereference () operators.
      ▪ ‘new’, ‘delete’, ‘throw’, and ‘throws’ key words.

Note: The (
) sign used in the declaration of C++ pointer is not a dereference operator. It is just a similar notation that creates a pointer.

➢ A constant value of one is added to ‘Cs’ at the detection of the following:

      ▪ Arithmetic operators → { + - * / % ++ -- }
      ▪ Relation operators → { == != > < >= <= }
      ▪ Logical operators → { && || ! }
      ▪ Bitwise operators → { | ^ ~ << >> >>> <<< }
      ▪ Miscellaneous operators → { , -> . :: }
      ▪ Assignment operators → {+= -= *= /= = >>>= |= &= %= <<= >>= ^= }
      ▪ Key words → {void, double, int, float, string, printf, println, cout, cin, ‘if’, ‘for’, ‘while’, ‘do-while’, ‘switch’, ‘case’ etc.}
      ▪ Manipulators → {‘endl’, ‘ \n’, etc. }
      ▪ Text inside a pair of double quotes → {Eg: “The greatest is” }
      ▪ Class, method, object, variable, and array names
      ▪ Numeric values (numbers) Note: Key words such as public, static, else, try and return are not considered under the size complexity factor.

Measuring the complexity of a program statement due to type of control structures (Ctc)

➢ For a program statement with a conditional control structure such as an ‘if’ condition, a weight of one is assigned for the ‘if’ condition and for each logical (‘&&’ and ‘||’) or bitwise (‘&’ and ‘|’) operator that is used to combine two or more conditions.

➢ For a program statement with an iterative control structure such as a ‘for’, ‘while’, or ‘do-while’ loop, a weight of two is assigned for the ‘for’, ‘while’, or ‘dowhile’ loop and for each logical (‘&&’ and ‘||’) or bitwise (‘&’ and ‘|’) operator that is used to combine two or more conditions.

➢ A weight of one is assigned for a program statement with a ‘catch’ statement.

➢ A weight of n is assigned for a program statement with a ‘switch’ statement with n number of cases.

➢ A weight of zero is assigned for all the other program statements in a program.

Measuring the complexity of a program statement due to nesting of control structures (Cnc)

➢ A weight of zero is added for program statements which does not contain any level of nesting.

➢ A weight of one is added for program statements which are at the outer most level of nesting.

➢ A weight of two is added for program statements which are at the next inner level of nesting.

➢ Similarly, the weight allocated for the program statements is increased by one for each level of nesting.

Measuring the complexity of a program statement due to inheritance (Ci)

➢ The complexity of all the program statements which belongs to a class is assigned the same weight that the class has due to its inheritance:

Complexity of a program statement of a class due to inheritance (Ci) = Complexity of the class due to its inheritance (CCi)

➢ Complexity of a class due to inheritance (CCi) is computed as follows:

Complexity of a class due to its inheritance (CCi) = Number of ancestor classes of the class + 1

Measuring total complexity of a program statement

➢ First, compute total weight (TW) of a program statement as follows:

TW = Ctc + Cnc + Ci

➢ Next, compute the complexity of a program statement (Cps) as follows:

Cps = Cs * TW

Measuring the complexity introduced due to recursion (Cr)

➢ Double the Cps values derived for each program statement that belongs to a recursive method.

Measuring complexity of a program (Cp)

➢ The complexity of a program (Cp) which consists of a recursive method is computed as follows:

Cp = Addition of ‘Cps’ values derived for the program statements which does not belong to a recursive method + Addition of ‘Cr’ values derived for the program statements that belongs to a recursive method

➢ The complexity of a program (Cp) which does not consist of a recursive method is computed as follows:

Cp = Addition of the ‘Cps’ values of all the program statements in a program

Unique Features

We’ve developed these components separately so that the ACC scanner can be used as continues inspection plugging which can be plugged into continues deployment systems to scan the code before deploying to a server.

Also, this ACC scanner can be compiled into a separate jar file which can later be developed into an eclipse plugin which shows complexity in real-time. It will help developers to write fewer complex codes while they write coding.

Deployment

  1. Go to the folder "ACC" and build the java project using mvn clean install. Then run the jar file and start the backend service using the command java -jar acc-0.0.1-SNAPSHOT.jar.

  2. Go to the folder "ACCClient" and open the console and enter the below commands to start the react client.

> npm install
> npm run dev
  1. Go to the folder "ACCScanner" build the java project using mvn clean install. Run the Scaner using the following command in the command line console and give the paths of the files you want to analyse with a unique project key. NOTE: When running the ACCScanner the path should contain the given config folder.
java -DprojectKey={Unique Project Key} -DsourcePath={Path to the project source folder} -jar {ACCScanner jar file name}
eg:- java -DprojectKey=ACC -DsourcePath=E:\Development\algorithemic-complexity-calculator -jar core-1.0-SNAPSHOT-jar-with-dependencies.jar
  1. Go to the url http://localhost:1234/home in your browser.

Copyright

(C) 2019 Tenusha Guruge
tenusha.wordpress.com

algorithemic-complexity-calculator's People

Contributors

aravinda1995 avatar ranmal-dewage avatar tenusha avatar vimukthirajapaksha avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.