Code Style - kukkich/Graphify GitHub Wiki

Именование

Используйте camaleCase Переменные и параметры методов именуются с маленькой буквы:

public double GetCircleArea(double radius)
{
    var area = Math.PI * radius * radius;
    return area;
}

Классы и все их члены (свойства, методы, константы, события, индексеры и т.д.) именуются с большой буквы:

public class Circle
{
    public double Radius { get; set; }

    public Circle(double radius)
    {
        ...
    }

    public double GetArea()
    {
        ...
    }
}

За исключением приватных не статических членов:

public class Circle
{
    private readonly double _radius;

    public Circle(double radius)
    {
        _radius = radius;
    }
}

Имена интерфейсов начинаются с заглавной буквы I:

public interface IShape
{
    double GetArea();
}

public class Circle : IShape
{
    ...
}

Порядок расположения членов в классе

public class Template
{
    // Constant Fields
    public const int PublicConstant = 1;
    protected const int ProtectedConstant = 2;
    private const int PrivateConstant = 3;

    // Properties
    public static int PublicStaticProperty { get; set; }
    public int PublicProperty { get; set; }
    protected static int ProtectedStaticProperty { get; set; }
    protected int ProtectedProperty { get; set; }
    private static int PrivateStaticProperty { get; set; }
    private int PrivateProperty { get; set; }

    // INDEXERS (if any)
    // public int this[int index] { get { return 0; } set { } }

    // Fields
    public static int PublicStaticField;
    public int PublicField;
    protected static int ProtectedStaticField;
    protected int ProtectedField;
    private static int PrivateStaticField;
    private static readonly int PrivateStaticReadonlyField = 9;
    private readonly int _privateReadonlyField = 8;
    private int _privateField;

    // Constructors
    public Template()
    {
        
    }

    // INTERFACE IMPLEMENTATIONS (if any)
    // e.g., public void SomeMethod() { }

    // Methods 
    public static void PublicStaticMethod() { }
    public void PublicMethod() { }
    protected static void ProtectedStaticMethod() { }
    protected void ProtectedMethod() { }
    private static void PrivateStaticMethod() { }
    private void PrivateMethod() { }
}

Не используйте сокращения (никогда!)

Помните, что ваш код кто-то будет читать и если для вас может быть очевидно, что значит sysCtx, то для того, кто это будет читать, sysCtx будет лишь каким-то набором из букв. Не ленитесь писать полное название, сэкономленные 2 секунды на написание сокращенного названия не стоят того. Особенно касается таких названий для полей/переменных, как p, x, y, t и так далее. И того:

Неправильно

_ctx = new SysCtx();
var clr = _palette.GetColor();
View.ClrBtn.Click();

Правильно

_context = new SystemContext();
var color = _palette.GetColor();
View.ClearButton.Click();

Исключения

Однако можно допустить в некоторых случаях использование сокращений, в основном при использовании делегатов, где очевидно, чем является аргумент, или где он не важнен, в таких случаях пишется короткое название, чтобы длинное название не отвлекало от чтения основного кода. Например, в LINQ запросах аргумент делегата можно называть x или по первой букве переменной:

var oleg = users.FirstOrDefault(x => x.Name == "Oleg");
var masha = users.FirstOrDefault(u => u.Name == "Masha");
var nearestPoints = points.Where(p => DistanseBetween(p, targetPoint) <= eps)
    .ToList();

или в методах API ReactiveUI ViewModel называют vm:

this.WhenActivated(disposables =>
{
    this.Bind(ViewModel, vm => vm.ReactiveProperty, view => view.ValueBox.Text)
        .DisposeWith(disposables);

    this.BindCommand(ViewModel, vm => vm.IncrementCommand, view => view.IncrementButton)
        .DisposeWith(disposables);
});

В целом старайтесь избегать неявностей. Например, модификатор членов класса по умолчанию private, однако, если вы добавляете приватный член, указывайте это явно:

Неправильно:

public class Circle
{
    readonly int _radius;

    public Circle(int radius)
    {
        _radius = radius;
    }
}

Правильно:

public class Circle
{
    private readonly int _radius;

    public Circle(int radius)
    {
        _radius = radius;
    }
}

Используйте ранний выход из метода для лучшей читаемости

Плохой вариант:

public void BadMethod()
{
    var result = DoSomething();

    if (result.IsSucceed)
    {
        // method continue
        // ...
    }
    throw new Exception();
    // or return something
}

Правильный вариант:

public void GoodMethod()
{
    var result = DoSomething();
    if (!result.IsSucceed)
    {
        throw new Exception();
        // or return something
    }

    // method continue
    // ...
}

Тестирование