# Best Practices

Rules which enforce generally accepted best practices.
Table of Contents

## AmbiguousResolution

Since: PMD 6.21.0

Priority: Medium (3)

There is multiple candidates for this type resolution. While generally this is not an error, this may indicate a bug.

This rule is defined by the following Java class: net.sourceforge.pmd.lang.modelica.rule.bestpractices.AmbiguousResolutionRule

Example(s):

    package Test
      package Inc1
        model X
        end X;
        model Y
        end Y;
      end Inc1;
      package Inc2
        model Y
        end Y;
        model Z
        end Z;
      end Inc2;
      model B
        import Test.Inc1.*;
        import Test.Inc2.*;
        Y y; // Class Y is imported twice
      end B;
    end Test;

Use this rule by referencing it:

    <rule ref="category/modelica/bestpractices.xml/AmbiguousResolution" />

## ClassStartNameEqualsEndName

Since: PMD 6.21.0

Priority: High (1)

Having a class starting with some name and some different name in its end clause is an error.

This rule is defined by the following XPath expression:

    //ClassSpecifier/*[SimpleName[1]/@Name != SimpleName[last()]/@Name]

Example(s):

    model SomeName
      Real x;
    equation
      x = 1;
    end SomeOtherName /* should be SomeName */;

Use this rule by referencing it:

    <rule ref="category/modelica/bestpractices.xml/ClassStartNameEqualsEndName" />

## ConnectUsingNonConnector

Since: PMD 6.21.0

Priority: Medium High (2)

Modelica specification requires passing connectors to the `connect` clause, while some implementations tolerate using it on plain variables, etc..

This rule is defined by the following Java class: net.sourceforge.pmd.lang.modelica.rule.bestpractices.ConnectUsingNonConnectorRule

Example(s):

    package Example
      connector Conn
        Real x;
        Real y;
      end Conn;

      model Test
        input Conn c1;
        output Conn c2;
        input Real x1;
        output Real x2;
      equation
        connect(c1, c2); // OK
        connect(x1, x2); // error, x1 and x2 are not (both) connectors
        // x1 = x2; // OK
      end Test;
    end Example;

Use this rule by referencing it:

    <rule ref="category/modelica/bestpractices.xml/ConnectUsingNonConnector" />