Skip to content

Latest commit

 

History

History
692 lines (492 loc) · 10.9 KB

PATTERNS.md

File metadata and controls

692 lines (492 loc) · 10.9 KB

Patterns Dictionary

If your pattern is not located there, it means that it has been recently implemented and doesn't have docs. Try to search it in github issues.


The code pattern is a rule of writing code. One proposes a hypothesis that using such patterns may affect the quality of source code.


Title: Assert in code

Code: P1

Description: If there is an assert statement in code block, and name of class doesn't end with Test, it is considered a pattern.

Example:

class Book {
  void foo(String x) {
    assert x != null; // here
  }

Title: Setter

Code: P2

Description: The method's name starts with set, then goes the name of the attribute. There are attributes assigning in the method. Also, asserts are ignored.

Example:

class Book {
  private String title;
  void setTitle(String) {
    this.title = t;
  }
}
class Book {
  private String title;
  public void setIsDiscrete() {
    assert !isDiscrete;
    assert !x; //ignore it
    this.isDiscrete = isDiscrete;
  }
}
class Book {
  private String isDiscrete;
  
  public void setIsDiscrete(String isDiscretem, boolean x) {
    assert !isDiscrete;
    assert !x; //ignore it
    this.isDiscrete = isDiscrete;
  }
}
class Book {
  private String title;
  
   @Override
  synchronized public void setConf(Configuration conf) {
    this.conf = conf;
    this.randomDevPath = conf.get(
        HADOOP_SECURITY_SECURE_RANDOM_DEVICE_FILE_PATH_KEY,
        HADOOP_SECURITY_SECURE_RANDOM_DEVICE_FILE_PATH_DEFAULT);
    close(); \\ some minor changes also do not affect, it is still Setter pattern
  }
}

Title: Empty Rethrow

Code: P3

Description: We throw the same exception as it was caught

Example:

class Book {
  void foo() {
    try {
      File.readAllBytes();
    } catch (IOException e) {
      // maybe something else here
      throw e; // here!
    }
  }
}

Title: ErClass

Code: P4

Description: If a class name is one of the following (or ends with this word), it's the pattern:

Manager, Controller, Router, Dispatcher, Printer, Writer, Reader, Parser, Generator, Renderer, Listener, Producer, Holder, Interceptor


Title: Force type casting.

Code: P5

Description: The force type casting considered as a pattern.

Examples:

// casting to int is 
public int square (int n) {
    return (int) java.lang.Math.pow(n,2);
}

Title: If return if detection

Code: P6

Description: If there is a return in if condition, it's a pattern.

Example:

class T1 {
    public void main(int x) {
        if (x < 0) {
            return;
        } else {
            System.out.println("X is positive or zero");
        }
    }
}

Title: Implements Multi

Code: P7

Description: If a class implements more than 1 interface it's a pattern

Example:

public class AnimatableSplitDimensionPathValue implements AnimatableValue<PointF, PointF> {
  private final AnimatableFloatValue animatableXDimension;
  private final AnimatableFloatValue animatableYDimension;

  public AnimatableSplitDimensionPathValue(
      AnimatableFloatValue animatableXDimension,
      AnimatableFloatValue animatableYDimension) {
    this.animatableXDimension = animatableXDimension;
    this.animatableYDimension = animatableYDimension;
  }
}
public class a implements A, B {
}

Title: Using instanceof operator.

Code: P8

Description: Using of instanceof operator considered as pattern.

Examples:

public static void main(String[] args) {
    Child obj = new Child();
    if (obj instanceof String)
        System.out.println("obj is instance of Child");
}
class Test
{
    public static void main(String[] args)
    {
        Child cobj = new Child();
        System.out.println(b.getClass().isInstance(c));
    }
}

Title: Many primary ctors

Code: P9

Description: If there is more than one primary constructors in a class, it is considered a pattern.

Examples:

class Book {

    private final int a;
    Book(int x) { // first primary ctor
        this.a = x;
    }
    Book() { // second
        this.a = 0;
    }
}

Title: Usage of method chaining more than one time.

Code: P10

Description: If we use more than one method chaining invocation.

Examples:

// here we use method chaining 4 times
public void start() {
    MyObject.Start()
        .SpecifySomeParameter()
        .SpecifySomeOtherParameter()
        .Execute();
}

Title: Multiple Try

Code: P11

Description: Once we see more than one try in a single method, it's a pattern.

Example:

class Foo {
  void bar() {
    try {
      // some code
    } catch (IOException ex) {
      // do something
    }
    // some other code
    try {  // here!
      // some code
    } catch (IOException ex) {
      // do something
    }
  }
}

Title: Non final attributes

Code: P12

Description: Once we see a mutable attribute (without final modifier), it's considered a pattern.

class Book {
  private int id;
  // something else
}

Title: Null checks

Code: P13

Description: If we check that something equals (or not equals) null (except in constructor) it is considered a pattern.

Examples:

class Foo {
  private String z;
  void x() {
    if (this.z == null) { // here!
      throw new RuntimeException("oops");
    }
  }
}

Title: Partial synchronized

Code: P14

Description: Here, the synchronized block doesn't include all statements of the method. Something stays out of the block.

Examples:

class Book {
  private int a;
  void foo() {
    synchronized (this.a) {
      this.a = 2;
    }
    this.a = 1; // here!
  }
}

Title: Redundant catch

Code: P15

Description: Here, the method foo() throws IOException, but we catch it inside the method.

Example:

class Book {
  void foo() throws IOException {
    try {
      Files.readAllBytes();
    } catch (IOException e) { // here
      // do something
    }
  }
}

Title: Return null

Code: P16

Description: When we return null, it's a pattern.

Example:

class Book {
  String foo() {
    return null;
  }
}

Title: String concatenation using + operator.

Code: P17

Description: Any usage string concatenation using + operator is considered as pattern match.

Examples:

public void start() {
    // this line is match the pattern
    System.out.println("test" + str1 + "34234" + str2);
    list = new ArrayList<>();
    for (int i = 0; i < 10; i++)
        list.add(Boolean.FALSE);
}

Title: Override method calls parent method.

Code: P18

Description: If we call parent method from override class method it is considered as the pattern.

Examples:

@Override
public void method1() {
    System.out.println("subclass method1");
    super.method1();
}

Title: Class constructor except this contains other code.

Code: P19

Description: The first constructor has this() and some other statements. This is the "hybrid constructor" pattern.

Examples:

class Book {
  private int id;
  Book() {
    this(1);
    int a = 1; // here
  }
  Book(int i) {
    this.id = I;
  }
}

Title: Line distance between variable declaration and first usage greater then threshold.

Code: P20_5, P20_7, P20_11

Description: If line distance between variable declaration and first usage exceeds some threshold we consider it as the pattern. We calculate only non-empty lines. P20_5 means that distance is 5

Examples:

// variable a declared and used with 2 lines distance
static void myMethod() { 
    string path1 = '/tmp/test1';
    int a = 4;

    string path2 = '/tmp/test2';
    string path3 = '/tmp/test3';
    a = a + 4;
}

Title: Variable is declared in the middle of the method body.

Code: P21

Description: All variable we need have to be declared at the beginning of its scope. If variable declared inside the scope following after logical blocks we consider that this is the pattern.

Examples:

// The declaration of variable list is match pattern.
static void myMethod2() { 
    int b = 4;
    b = b + 6;
    List<Integer> list = new List<Integer>();
}

Title: Array as argument

Code: P22

Description: If we pass an array as an argument, it's a pattern. It's better to use objects, instead of arrays.

Example:

class Foo {
  void bar(int[] x) {
  }
}

Title: Joined Validation

Code: P23

Description: Once you see a validation (if with a single throw inside) and its condition contains more than one condition joined with OR -- it's a pattern.

Example:

class Book {
  void print(int x, int y) {
    if (x == 1 || y == 1) { // here!
      throw new Exception("Oops");
    }
  }
}

Title: Class declaration must always be final

Code: P24

Description: Once you see a non final method, it's a pattern..

Example:

class Book {
  private static void foo() {
  }
}

Title: Private static method

Code: P25

Description: Once you see a private static method, it's a pattern.

Example:

class Book {
  private static void foo() {
    //something
  }
}

Title: Public static method

Code: P26

Description: Once you see a public static method, it's a pattern.

Example:

class Book {
  puplic static void foo() {
    //something
  }
}

Title: Var siblings

Code: 27

Description: Here fileSize and fileDate are "siblings" because they both have file as first part of their compound names. It's better to rename them to size and date.

file and fileSize are NOT siblings.

Example:

class Foo {
  void bar() {
    int fileSize = 10;
    Date fileDate = new Date();
  }
}

Title: Assign null

Code: P28

Description: Once we see = null, it's a pattern.

Example:

class Foo {
  void bar() {
    String a = null; // here
  }
}

Title: Multiple While pattern

Code: P29

Description: Once you see two or more while statements in a method body, it's a pattern.

Examples:

class Book {
  void foo() {
    while (true) {
    }
    // something
    while (true) {
    }
  }
}

Title: Protected method

Code: P30

Description: Once we find a protected method in a class, it's a pattern.


Title: Send null

Code: P31

Description: Once we see that null is being given as an argument to some method, it's a pattern.

Example:

class Foo {
  void bar() {
    FileUtils.doIt(null); // here
  }
}

Title: Nested loop

Code: P32

Description: Once we find a loop (for / while) inside another loop it's a pattern.

Example:

class Foo {
  void foo() {
    white (true) {
      for (;;) { // here
      }  
    }
  }
}