Skip to content

Instantly share code, notes, and snippets.

Replace constrcutor of factory method

Конструктор нужно заменить фабричным методом, если не хватает возможностей самого конструктора, например нужно создавать экземпляры разных типов имеющих общего наследника, такое бывает, в проценссе рефакторинга Replace Type Code Subclasses, когда мне нужно создать подклассы, а конструктора не хватает, поскольку он ничего не возвращает, а только создает объект

  public enum EmployeeType
    {
        Fix,
        Hourly
    }
@eterekhin
eterekhin / Pull Up Field.Pull Up Method. Pull Up Constructor Body. Push Down Method Push Down Field.md
Last active September 21, 2019 10:01
Pull Up Field.Pull Up Method. Pull Up Constructor Body. Push Down Method Push Down Field.

Pull Up Field

Подъем поля применяется когда во всех наследниках это поле дублируется, сложнее ситуация, когда у нескольких наследников дублируется только это поле, тогда, возможно, исходя из этого общего поведения можно сформировать еще один уровень иерархии, либо, если поле дублируется у меньшинства наследников, оставить все как есть, в будущем при необходимости можно будет применить данный рефакторинг

Pull Up Method

Вышеприведенное также верно и для подъема метода

Pull Up Constructor Body

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

Push Down Method

@eterekhin
eterekhin / Fowler.Extract Subclass.Extract Superclass.Extract Interface.Collapse Hierarchy.Form Template Method. Replace Inheritance with Delegation.Replace Delegation with Inheritance.md
Last active September 22, 2019 06:15
Fowler.Extract Subclass.Extract Superclass.Extract Interface.Collapse Hierarchy.Form Template Method. Replace Inheritance with Delegation.Replace Delegation with Inheritance

Extract Subclass

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

 public class Person
    {
        private string Name { get; }
        private string Surname { get; }

        private IEnumerable<Salary> Salaries { get; }

Tease Apart Inheritance

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

 public abstract class Salary
    {
        public decimal Value { get; }
        public abstract decimal GetResult();
        public abstract void PrintSalary();
    }
@eterekhin
eterekhin / Модель выполнения кода в среде CLR. Компиляция исходного кода в управляемые модули.Объединение управляемых модулей в сборку.Исполнение кода сборки.md
Last active March 23, 2020 05:46
Модель выполнения кода в среде CLR. Компиляция исходного кода в управляемые модули.Объединение управляемых модулей в сборку.Исполнение кода сборки

Компиляция исходного кода в управляемые модули

Компилятор c# преобразует исходный код в промежуточный язык IL(Intermediate Language), из которого возможно преобразование в машинные команды доступные. Далее в игру вступает CLR(Common Language Runtime). CLR получает управляемые модули(обычно одна сборка хранит ровно один модуль(например, сборка ConsoleApp.dll, будет хранить только один модуль ConsoleApp, однако можно размещать несколько модулей в одной сборке, для этого нужно использовать префикс --addmodule, при запуске csc), при компиляции модуля вместе с IL кодом модуля, также генерируется метаданные, которые помогают работать IntelliSense и сборщику мусора отслеживать жизненный цикл объектов.При помощи метаданных сборщик мусора может определитьтип объектов и узнать как на них ссылкаются другие объекты.

Объединение управляемых модулей в сборку

После создания управляемых модулей компилятор объединяет их в единую сборку, также в сборку попадают файлы ресурсов(.txt,.html). У

   public class Root
    {
        public Nested1Root Nested1Root;
        public Nested1Root2 Nested1Root2;
    }

    public class Nested1Root
    {
 public Least Least;

Все типы - производные от Sytem.Object У них есть публичные методы

  • ToString
  • Equals(object obj)
  • GetHashCode()
  • GetType() и protected методы
  • MemberwiseClone
  • Finalize
@eterekhin
eterekhin / Рихтер.Связь между сборками и пространством имен.Как разные компоненты взаимодействуют во время выполнения..md
Last active October 5, 2019 07:52
Рихтер.Связь между сборками и пространством имен.Как разные компоненты взаимодействуют во время выполнения.

Связь между сборками и пространством имен

В разных сборках могут быть одинаковые пространства имен, открыв один такой namespace, будут доступны типы из разных сборок

Как разные компоненты взаимодействуют во время выполнения

При исполнении программы у каждого потока есть свой стек, его размер - 1МБ В процессе выполнения программы в этот стек помещаются разлиные значения переменных и полей, например при вызове метода T1:

        public int T()
        {
 var v = "q";

В c# существуют примитивные типы(такие как Int32,Double...), поскольку примитивные типы - самые частоиспользуемые в языке, то для них существуют псевдонимы (int,double). Это Value типы которые хранятся в стеке В C# существуют проблемы связанные с тем, что есть возможность переполнения типа, например:

int s = int.MaxValue - 1;
int ss = 2;
var res = s + ss; // (-int.MaxValue)

Т.е переполнение не генерирует ошибку, а просто складывает при этом закольцовывая результат Для того чтобы при переполнении генерировалась ошибка можно глобально поставить это используя флаг компиляции /checked+

Упаковка это процесс помещения объекта из стека (значимого типа) в кучу, если поэтапно:

  1. Для объекта выделяется место в куче, это место для указателя на типовой объект и индекса синхронизации + длина значимого типа
  2. Происходит копирование объекта в выделенное место
  3. Возвращается ссылка на этот объект При распаковке выполняется меньше действий, только взятие адресов у полей структуры, чтобы в даньшей скопировать их в стек. Распаковкой называется именно взятие адресов, а не копирование, поэтому распаковка это более легкая операция.

Только при касте к интерфейсу можно изменить упакованный объект значимого типа

Альтернатива только распаковать его, изменить и снова упаковать но тогда старый объект останется в куче и будет собран сборщиком мусора, т.е память будет выделена дважды: