Skip to content

Instantly share code, notes, and snippets.

EF Core Concurrency

public class Person{ 
   public int Id{get;set;}
   [ConcurrentCheck]
   public string FirstName{get;set;}
   public int Age{get;set;}
}
@eterekhin
eterekhin / efcoremigrations.md
Last active August 15, 2020 06:38
Миграции в EF Core

Миграции в EF Core

Миграции используются для того, чтобы поддерживать в консистентном состоянии модель и базу данных. При изменении модели( это может быть добавление новой сущности, ссылки, или изменение отношей между сущностями, добавление ограничений на длину строки, размер числа и т.д) необходиомо выполнить миграцию:

dotnet ef migrations add <Migration Name> -v -c <Context Name> -s <Path to Startup Project>

Extract Method

Простой шаблон, утверждающий идею расщепление одного длинного метода на несколько меньших, встречаются проблемы с локальными переменными внутри метода
 public string PrintInfo(IEnumerable<Month> months)
        {
            var salaryMoreWhen200 = false;
            var monthsWhenSalaryMore200 = new List<Month>();
@eterekhin
eterekhin / Martin Fowler.Replace Temp with Query.Introduce Explaining Variable.Split Temporary Variable.Remove Assignments to Parameters.Replace Method with Method Object.Substitute Algorithm.md
Last active September 14, 2019 16:31
Martin Fowler.Replace Temp with Query.Introduce Explaining Variable.Split Temporary Variable.Remove Assignments to Parameters.Replace Method with Method Object.Substitute Algorithm

Replace Temp With Query

Замена переменной вызовом метода. Полезно, когда количество локальных переменных в методе настолько много, что сложно применить Extract Method, когда эти переменные переплелись между собой:

        public void PrintStatistic(IEnumerable<Month> months)
        {
            var avg = MonthDecimal.Average(x => x.Value);
            if (avg > 200)
            {
                Console.WriteLine($"AVG: {avg - 10}");

Move Method

Рефакторинг при котором метод в одном классе больше интересуется другим классом, чем своим собственным, наглядный пример:

public class User
    {
        public Account Account { get; set; }
        public string Name { get; set; }
        public string Surname { get; set; }

        public void PrintSalary()
@eterekhin
eterekhin / Fowler.Refactoring.Self Encapsulate Field.Replace Data Value With Object.Change Value To Reference.Change Reference To Value.Replace Array With Object.Duplicate Observer Data.Change Unidirectional Association to Bidirectional.Change BidirectionalAsso
Last active September 15, 2019 06:18
Fowler.Refactoring.Self Encapsulate Field.Replace Data Value With Object.Change Value To Reference.Change Reference To Value.Replace Array With Object.Duplicate Observer Data.Change Unidirectional Association to Bidirectional.Change BidirectionalAssociation to Unidirectional.

Self Encapsulate Field

public int _value; 

Побавляем и меняем модификатор доступа _int

private int _value; 
 public int Value
        {
            get
@eterekhin
eterekhin / Replace Magic Number with Symbolic Constant. Encapsulate Field.Encapsulate Collection.Replace Record with Data Class.Replace Type Code with Class.Replace Type Code Subclass.Replace Type Code with State or Strategy. Replace Subclass with Fields.md
Last active September 17, 2019 06:41
Replace Magic Number with Symbolic Constant. Encapsulate Field.Encapsulate Collection.Replace Record with Data Class.Replace Type Code with Class.Replace Type Code Subclass.Replace Type Code with State/Strategy. Replace Subclass with Fields

Replace Magic Number with Symbolic Constant

Очевидный прием, для облегчения чтения кода, если в коде встречается константа, о назначении которой сложно догадаться, назовите ее и используйте замените все вхождения числа

Encapsulate Field

Нужно применять всегда,особенно когда вокруг этого поля появляется логика

        private int _total;
        public int Total
        {
            get => _total;
@eterekhin
eterekhin / Fowler.Decompose Conditional.Consolite Conditional Expression.Consolidate Duplicate Conditional Fragment.Remove Control Flag.Replace Nested Conditional with Guard Clauses. Replace Conditional with Polimorphism.md
Last active September 17, 2019 06:40
Fowler.Decompose Conditional.Consolite Conditional Expression.Consolidate Duplicate Conditional Fragment.Remove Control Flag.Replace Nested Conditional with Guard Clauses. Replace Conditional with Polimorphism

Decomposite Conditional

Простой рефакторинг, если в if(...) сложное условие вынесите его в метод и назовите так, чтобы сразу можно было понять, что это за условие

      public enum PeopleType
      {
        Child,
        Teenager,
        YoungMan,
        Man,
@eterekhin
eterekhin / Introduce Null Object.Introduce Assertion. Rename Method. Add Parameter. Remove Parameter.md
Last active September 18, 2019 03:26
Introduce Null Object.Introduce Assertion. Rename Method. Add Parameter. Remove Parameter

Introduce Null Object

Удобный паттерн если в приложении много проверок на null, в c# можно использовать динамические прокси для достижения такого эффекта. Предположим, что система спроектирована так, что в массиве

public class Person
    {
        public Salary January { get; }
        public Salary February { get; }
        public Salary March { get; }
        public Salary April { get; }
@eterekhin
eterekhin / Fowler.Separate Query from Modifier.Parameterize Method.Replace Parameter with Explicit Methods.Peplace Parameter with Method.Introduce Parameter Object.Remove Setting Method.Hide Method.md
Last active September 18, 2019 04:19
Fowler.Separate Query from Modifier.Parameterize Method.Replace Parameter with Explicit Methods.Peplace Parameter with Method.Introduce Parameter Object.Remove Setting Method.Hide Method

Separate Query from Modifier

Полезный принцип, он утвержает, что чтение и модификация чего либо должны разделяться, например:

 public Salary PaidSalary()
        {
            var currentMonth = DateTime.Now.Month;
            decimal result = 0;
           
            if (currentMonth < 1)
                result += January.Value;