{"id":365225,"date":"2024-05-21T02:33:41","date_gmt":"2024-05-21T02:33:41","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=365225"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=365225","title":{"rendered":"<span>\u0421\u0442\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c. \u0427\u0430\u0441\u0442\u044c 2.1<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0442\u0430\u043a\u0438\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0432\u043e\u0448\u043b\u0438 \u0432 &#171;\u0411\u0430\u043d\u0434\u0443 \u0447\u0435\u0442\u044b\u0440\u0451\u0445&#187;, \u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u041a \u043d\u0438\u043c \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043d\u0435\u0441\u0442\u0438 \u0442\u0430\u043a\u0438\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b, \u043a\u0430\u043a \u00abAbstract Document\u00bb, \u00abActive Object\u00bb, \u00abAcyclic Visitor\u00bb, \u00abBalking\u00bb, \u00abBytecode\u00bb, \u00abCaching\u00bb, \u00abCallback\u00bb, \u00abAsync Method Invocation\u00bb, \u00abContext Object\u00bb, \u00abConverter\u00bb, \u00abData Access Object\u00bb, \u00abData Transfer Object\u00bb, \u00abDirty Flag\u00bb, \u00abDouble Buffer\u00bb, \u00abEvent Queue\u00bb, \u00abExecute Around\u00bb, \u00abMonad\u00bb, \u00abMono State\u00bb, \u00abMute Idiom\u00bb, \u00abNaked Objects\u00bb, \u00abNull Object\u00bb, \u00abObject Mother\u00bb, \u00abObject Pool\u00bb, \u00abParameter Object\u00bb \u0438 \u043c\u043d\u043e\u0433\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0435.<\/p>\n<h2>\u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 (Abstract Document)<\/h2>\n<p>\u041f\u0430\u0442\u0442\u0435\u0440\u043d \u00ab\u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u00bb &#8212; \u044d\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0438 \u0434\u0440\u0435\u0432\u043e\u0432\u0438\u0434\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u043b\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u044f\u0442\u044c \u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0431\u0435\u0437 \u0438\u0445 \u0432\u0435\u0434\u043e\u043c\u0430. <\/p>\n<p>\u041f\u0430\u0442\u0442\u0435\u0440\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044e \u0441\u0432\u043e\u0439\u0441\u0442\u0432, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u0442\u0438\u043f\u043e\u0432 \u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043d\u0430 \u043d\u0430\u0431\u043e\u0440\u044b \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432.  <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/9fb\/308\/46e\/9fb30846e31702be6050467a99d9e760.jpg\" alt=\"\u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\" title=\"\u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\" width=\"1000\" height=\"667\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9fb\/308\/46e\/9fb30846e31702be6050467a99d9e760.jpg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>\u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442<\/figcaption><\/div>\n<\/figure>\n<p>\u0421\u0443\u0442\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u0430\u0440\u0438\u0430\u0446\u0438\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0431\u0449\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u0430 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0447\u043d\u043e\u0441\u0442\u044c &#8212; \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <code>Dictionary&lt;String, Object><\/code>. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u0430\u0440\u0442\u0443 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0438 \u043b\u044e\u0431\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.  <\/p>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043e\u0431\u0449\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0442\u0430\u043a\u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439, \u043a\u0430\u043a \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u044b \u00ab\u0421\u0442\u0440\u043e\u043a\u0430-\u041e\u0431\u044a\u0435\u043a\u0442\u00bb, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u043e \u043a\u043b\u044e\u0447\u0443 \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">public interface IDocument {     public void Put(string key, object value);      public object Get(string key);      public List&lt;Dictionary&lt;string, object>> Children(string key); }  public abstract class AbstractDocument : IDocument {     protected Dictionary&lt;string, object> Dictionary;      protected AbstractDocument(Dictionary&lt;string, object> keyValuePairs)     {         this.Dictionary = keyValuePairs;     }      public List&lt;Dictionary&lt;string, object>> Children(string key)     {         List&lt;Dictionary&lt;string, object>> results = new();          if (Get(key) is not List&lt;Dictionary&lt;string, object>> childrens)          {             return results;         }          foreach (Dictionary&lt;string, object> children in childrens)         {             results.Add(children);         }          return results;     }      public object Get(string key)     {         return Dictionary[key];     }      public void Put(string key, object value)     {         Dictionary.Add(key, value);     } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 <code>Property<\/code> \u0438 \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0434\u043b\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0442\u0438\u043f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430.<\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">public enum Property {     Parts, Chars, Rows, Colls, Type, Version }  public interface IParts : IDocument {     public object GetParts(); }  public interface IChars : IDocument {     public int GetChars(); }  public interface IType : IDocument {     public string GetType(); }  public interface IRows : IDocument {     public int GetRows(); }  public interface IColls : IDocument {     public int GetColls(); }  public interface IVersion : IDocument {     public int GetVersion(); }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0440\u0430\u0437\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e AbstractDocument \u0438 \u0442\u0435\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u0437\u0430\u0434\u0430\u043d\u044b \u0432\u044b\u0448\u0435.<\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">public class TextDocument : AbstractDocument,    IParts, IChars, IType, IVersion {     public TextDocument(Dictionary&lt;string, object> keyValuePairs)        : base(keyValuePairs)     {         this.Dictionary = keyValuePairs;     }      public int GetChars()     {         return (int)this.Dictionary[Property.Chars.ToString()];     }      public object GetParts()     {         return this.Dictionary[Property.Parts.ToString()];     }      public int GetVersion()     {         return (int)this.Dictionary[Property.Version.ToString()];     }      public new string GetType()     {         return (string)this.Dictionary[Property.Type.ToString()];     } }  public class TableDocument : AbstractDocument,    IType, IRows, IColls, IVersion {     public TableDocument(Dictionary&lt;string, object> keyValuePairs)        : base(keyValuePairs)     {         this.Dictionary = keyValuePairs;     }      public new string GetType()     {         return (string)this.Dictionary[Property.Type.ToString()];     }      public int GetRows()     {         return (int)this.Dictionary[Property.Rows.ToString()];     }      public int GetColls()     {         return (int)this.Dictionary[Property.Colls.ToString()];     }      public int GetVersion()     {         return (int)this.Dictionary[Property.Version.ToString()];     } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b. \u041e\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0430\u043c\u0438: \u0442\u0438\u043f, \u0432\u0435\u0440\u0441\u0438\u044f, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b. \u0422\u0430\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0438\u043c\u0435\u0435\u0442 \u0432\u0435\u0440\u0441\u0438\u044e, \u0442\u0438\u043f, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432.<\/p>\n<details class=\"spoiler\">\n<summary>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">private static void Main(string[] args) {     Dictionary&lt;string, object> tableDocumentProperties = new()     {         { Property.Version.ToString(), 1 },          { Property.Rows.ToString(), 10 },          { Property.Colls.ToString(), 5 },          { Property.Type.ToString(), \".xslx\" }     };      Dictionary&lt;string, object> textDocumentProperties = new()     {         { Property.Version.ToString(), 1 },          { Property.Chars.ToString(), 10000 },          { Property.Type.ToString(), \".docx\" },          {             Property.Parts.ToString(),             new List&lt;Dictionary&lt;string, object>>() { tableDocumentProperties }         }     };      TextDocument textDocument = new(textDocumentProperties);      Console.WriteLine(textDocument.GetType());      Console.WriteLine(textDocument.GetVersion());      Console.WriteLine(textDocument.GetChars());      var textDocumentParts = textDocument.GetParts() as List&lt;Dictionary&lt;string, object>>;      foreach (var part in textDocumentParts)     {         foreach (var item in part.Keys)         {             Console.WriteLine(item + \" \" + part[item]);         }     } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h2>\u041c\u043e\u043d\u0430\u0434\u0430 (Monad)<\/h2>\n<p>\u041f\u0430\u0442\u0442\u0435\u0440\u043d \u00ab\u041c\u043e\u043d\u0430\u0434\u0430\u00bb &#8212; \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0443\u0441\u043f\u0435\u0445\u0430 \u0438\u043b\u0438 \u043d\u0435\u0443\u0434\u0430\u0447\u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. <\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0448\u0430\u0433 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441 \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e, \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0448\u0430\u0433\u0438 \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u044b.<\/p>\n<details class=\"spoiler\">\n<summary>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">public class Validator&lt;T> {     private readonly T value;     private readonly List&lt;Exception> errors = new List&lt;Exception>();      public Validator(T value)     {         this.value = value;     }      public Validator&lt;T> Validate(Predicate&lt;T> validation, string message)     {         if (!validation(value))         {             errors.Add(new Exception(message));         }          return this;     }      public (bool, List&lt;string>) Get()     {         if (errors.Any())         {             List&lt;string> result = new List&lt;string>();              foreach (Exception e in errors)             {                 result.Add(e.Message);             }              return (false, result);         }          return (true, new List&lt;string>());     } }  public record User(string Name, string Surname, string Fathername) { }  private static void Main(string[] args) {     User fio = new(\"\u0418\u0432\u0430\u043d\", \"\u0418\u0432\u0430\u043d\u043e\u0432\u0438\u0447\", \"\u0418\u0432\u0430\u043d\u043e\u0432\");      Validator&lt;User> validator =          new Validator&lt;User>(fio)         .Validate(x => !string.IsNullOrEmpty(x.Name), \"Name is null\")         .Validate(x => !string.IsNullOrEmpty(x.Surname), \"Surname is null\")         .Validate(x => !string.IsNullOrEmpty(x.Fathername), \"Fathername is null\");      (bool, List&lt;string>) pair = validator.Get();      Console.WriteLine(pair.Item1); }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h2>\u041c\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 (Object Mother)<\/h2>\n<p>\u041f\u0430\u0442\u0442\u0435\u0440\u043d \u00ab\u041c\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\u00bb &#8212; \u044d\u0442\u043e \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0438\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u043c\u0438. \u041e\u0431\u044b\u0447\u043d\u043e \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430 \u0434\u043b\u044f \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0438 \u044e\u0440\u0438\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043b\u0438\u0446. \u0412 \u043e\u0431\u043e\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b, \u043d\u043e \u0443 \u043d\u0438\u0445 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432.<\/p>\n<details class=\"spoiler\">\n<summary>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">public class Developer {     private string? name;     private string? description;     private bool isCompany;      public void SetName(string name)     {         this.name = name;     }      public void SetDescription(string description)     {         this.description = description;     }      public void SetIsCompany(bool flag)     {         this.isCompany = flag;     } }  public static class DeveloperMother {     public static Developer CreatePerson(string name, string description)     {         Developer person = new();          person.SetName(name);          person.SetDescription(description);          person.SetIsCompany(false);          return person;     }      public static Developer CreateCompany(string name, string description)     {         Developer person = new();          person.SetName(name);          person.SetDescription(description);          person.SetIsCompany(true);          return person;     } }  private static void Main(string[] args) {     DeveloperMother.CreatePerson(\"Developer X\", \"Mobile apps\");     DeveloperMother.CreateCompany(\"VALVe\", \"CS:GO\"); }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h2>\u041f\u0443\u043b \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 (Object Pool)<\/h2>\n<p>\u041f\u0430\u0442\u0442\u0435\u0440\u043d \u00ab\u041f\u0443\u043b \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\u00bb &#8212; \u044d\u0442\u043e \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0438\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0440\u0430\u043d\u043d\u0435\u0435. \u041e\u043d \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u043a\u043e\u0433\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0442\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043a\u043b\u0438\u0435\u043d\u0442 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442, \u0442\u043e \u043f\u0443\u043b \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d \u0440\u0430\u043d\u044c\u0448\u0435. \u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442. \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043d\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/p>\n<details class=\"spoiler\">\n<summary>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">public class ObjectPool&lt;T> {     private readonly ConcurrentBag&lt;T> _objects;     private readonly Func&lt;T> _objectGenerator;      public ObjectPool(Func&lt;T> objectGenerator)     {         this._objectGenerator = objectGenerator ?? throw new ArgumentNullException(nameof(objectGenerator));         this._objects = new ConcurrentBag&lt;T>();     }      public T Get()     {         return this._objects.TryTake(out T item) ? item : this._objectGenerator();     }      public void Return(T item)     {         this._objects.Add(item);     } }  public class ArrayObject {     public int[] Nums { get; set; }      public ArrayObject()     {         this.Nums = new int[1000000];          Random rand = new();          for (int i = 0; i &lt; this.Nums.Length; i++)         {             this.Nums[i] = rand.Next();         }     }      public static double LOG(int value)     {         return Math.Log(value);     }      public static double SQRT(int value)     {         return Math.Sqrt(value);     } }  private static void Main(string[] args) {     CancellationTokenSource cancellationTokenSource = new();      ObjectPool&lt;ArrayObject> objectPool = new(() => new ArrayObject());      Parallel.For(0, 1000000, (i, state) =>     {         ArrayObject example = objectPool.Get();          Console.WriteLine(ArrayObject.SQRT(i));          objectPool.Return(example);                  if (cancellationTokenSource.Token.IsCancellationRequested)         {             state.Stop();         }     }); }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h2>\u041f\u043e\u0448\u0430\u0433\u043e\u0432\u044b\u0439 \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c (Step Builder)<\/h2>\n<p>\u041f\u0430\u0442\u0442\u0435\u0440\u043d \u00ab\u041f\u043e\u0448\u0430\u0433\u043e\u0432\u044b\u0439 \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c\u00bb &#8212; \u044d\u0442\u043e \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0438\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0448\u0430\u0433\u043e\u0432. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a.<\/p>\n<details class=\"spoiler\">\n<summary>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">public class TechniqueDB {     public int Id { get; set; }     public string Date { get; set; }     public string Image { get; set; }     public string Title { get; set; }     public string Subtitle { get; set; }     public string Theme { get; set; }     public string Author { get; set; }     public string Algorithm { get; set; }     public bool Removed { get; set; }  }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">public class TechniqueBuilder {     private readonly TechniqueDB techniqueDB;      public TechniqueBuilder()     {         this.techniqueDB = new TechniqueDB();     }      public TechniqueBuilder SetIdentifier(int identifier)     {         this.techniqueDB.Id = identifier;         return this;     }      public TechniqueBuilder SetDate(string date)     {         this.techniqueDB.Date = date;         return this;     }     public TechniqueBuilder SetTitle(string title)     {         this.techniqueDB.Title = title;         return this;     }     public TechniqueBuilder SetSubtitle(string subtitle)     {         this.techniqueDB.Subtitle = subtitle;         return this;     }      public TechniqueBuilder SetTheme(string theme)     {         this.techniqueDB.Theme = theme;         return this;     }      public TechniqueBuilder SetAuthor(string author)     {         this.techniqueDB.Author = author;         return this;     }      public TechniqueBuilder SetAlgorithm(string algorithm)     {         this.techniqueDB.Algorithm = algorithm;         return this;     }      public TechniqueBuilder SetImage(string image)     {         this.techniqueDB.Image = image;         return this;     }      public TechniqueBuilder IsVisible     {         get         {             this.techniqueDB.Removed = false;             return this;         }     }     public TechniqueDB Build()     {         return this.techniqueDB;     } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">TechniqueBuilder builder = new();  TechniqueDB technique =       builder.SetIdentifier(count + 1)     .SetTitle(this.Name)     .SetSubtitle(this.Description)     .SetTheme(this.Theme)     .SetImage(this.Path)     .SetAuthor(this.Author)     .SetAlgorithm(this.Algorithm)     .SetDate(date)     .Build();<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 &#171;\u0421\u0442\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c. \u0427\u0430\u0441\u0442\u044c 2.2&#187;.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/786236\/\"> https:\/\/habr.com\/ru\/articles\/786236\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0442\u0430\u043a\u0438\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0432\u043e\u0448\u043b\u0438 \u0432 &#171;\u0411\u0430\u043d\u0434\u0443 \u0447\u0435\u0442\u044b\u0440\u0451\u0445&#187;, \u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u041a \u043d\u0438\u043c \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043d\u0435\u0441\u0442\u0438 \u0442\u0430\u043a\u0438\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b, \u043a\u0430\u043a \u00abAbstract Document\u00bb, \u00abActive Object\u00bb, \u00abAcyclic Visitor\u00bb, \u00abBalking\u00bb, \u00abBytecode\u00bb, \u00abCaching\u00bb, \u00abCallback\u00bb, \u00abAsync Method Invocation\u00bb, \u00abContext Object\u00bb, \u00abConverter\u00bb, \u00abData Access Object\u00bb, \u00abData Transfer Object\u00bb, \u00abDirty Flag\u00bb, \u00abDouble Buffer\u00bb, \u00abEvent Queue\u00bb, \u00abExecute Around\u00bb, \u00abMonad\u00bb, \u00abMono State\u00bb, \u00abMute Idiom\u00bb, \u00abNaked Objects\u00bb, \u00abNull Object\u00bb, \u00abObject Mother\u00bb, \u00abObject Pool\u00bb, \u00abParameter Object\u00bb \u0438 \u043c\u043d\u043e\u0433\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0435.<\/p>\n<h2>\u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 (Abstract Document)<\/h2>\n<p>\u041f\u0430\u0442\u0442\u0435\u0440\u043d \u00ab\u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u00bb &#8212; \u044d\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0438 \u0434\u0440\u0435\u0432\u043e\u0432\u0438\u0434\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u043b\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u044f\u0442\u044c \u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0431\u0435\u0437 \u0438\u0445 \u0432\u0435\u0434\u043e\u043c\u0430. <\/p>\n<p>\u041f\u0430\u0442\u0442\u0435\u0440\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044e \u0441\u0432\u043e\u0439\u0441\u0442\u0432, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u0442\u0438\u043f\u043e\u0432 \u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043d\u0430 \u043d\u0430\u0431\u043e\u0440\u044b \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432.  <\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442<\/figcaption><\/div>\n<\/figure>\n<p>\u0421\u0443\u0442\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u0430\u0440\u0438\u0430\u0446\u0438\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0431\u0449\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u0430 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0447\u043d\u043e\u0441\u0442\u044c &#8212; \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <code>Dictionary&lt;String, Object><\/code>. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u0430\u0440\u0442\u0443 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0438 \u043b\u044e\u0431\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.  <\/p>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043e\u0431\u0449\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0442\u0430\u043a\u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439, \u043a\u0430\u043a \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u044b \u00ab\u0421\u0442\u0440\u043e\u043a\u0430-\u041e\u0431\u044a\u0435\u043a\u0442\u00bb, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u043e \u043a\u043b\u044e\u0447\u0443 \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">public interface IDocument {     public void Put(string key, object value);      public object Get(string key);      public List&lt;Dictionary&lt;string, object>> Children(string key); }  public abstract class AbstractDocument : IDocument {     protected Dictionary&lt;string, object> Dictionary;      protected AbstractDocument(Dictionary&lt;string, object> keyValuePairs)     {         this.Dictionary = keyValuePairs;     }      public List&lt;Dictionary&lt;string, object>> Children(string key)     {         List&lt;Dictionary&lt;string, object>> results = new();          if (Get(key) is not List&lt;Dictionary&lt;string, object>> childrens)          {             return results;         }          foreach (Dictionary&lt;string, object> children in childrens)         {             results.Add(children);         }          return results;     }      public object Get(string key)     {         return Dictionary[key];     }      public void Put(string key, object value)     {         Dictionary.Add(key, value);     } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 <code>Property<\/code> \u0438 \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0434\u043b\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0442\u0438\u043f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430.<\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">public enum Property {     Parts, Chars, Rows, Colls, Type, Version }  public interface IParts : IDocument {     public object GetParts(); }  public interface IChars : IDocument {     public int GetChars(); }  public interface IType : IDocument {     public string GetType(); }  public interface IRows : IDocument {     public int GetRows(); }  public interface IColls : IDocument {     public int GetColls(); }  public interface IVersion : IDocument {     public int GetVersion(); }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0440\u0430\u0437\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e AbstractDocument \u0438 \u0442\u0435\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u0437\u0430\u0434\u0430\u043d\u044b \u0432\u044b\u0448\u0435.<\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">public class TextDocument : AbstractDocument,    IParts, IChars, IType, IVersion {     public TextDocument(Dictionary&lt;string, object> keyValuePairs)        : base(keyValuePairs)     {         this.Dictionary = keyValuePairs;     }      public int GetChars()     {         return (int)this.Dictionary[Property.Chars.ToString()];     }      public object GetParts()     {         return this.Dictionary[Property.Parts.ToString()];     }      public int GetVersion()     {         return (int)this.Dictionary[Property.Version.ToString()];     }      public new string GetType()     {         return (string)this.Dictionary[Property.Type.ToString()];     } }  public class TableDocument : AbstractDocument,    IType, IRows, IColls, IVersion {     public TableDocument(Dictionary&lt;string, object> keyValuePairs)        : base(keyValuePairs)     {         this.Dictionary = keyValuePairs;     }      public new string GetType()     {         return (string)this.Dictionary[Property.Type.ToString()];     }      public int GetRows()     {         return (int)this.Dictionary[Property.Rows.ToString()];     }      public int GetColls()     {         return (int)this.Dictionary[Property.Colls.ToString()];     }      public int GetVersion()     {         return (int)this.Dictionary[Property.Version.ToString()];     } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b. \u041e\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0430\u043c\u0438: \u0442\u0438\u043f, \u0432\u0435\u0440\u0441\u0438\u044f, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b. \u0422\u0430\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0438\u043c\u0435\u0435\u0442 \u0432\u0435\u0440\u0441\u0438\u044e, \u0442\u0438\u043f, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432.<\/p>\n<details class=\"spoiler\">\n<summary>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">private static void Main(string[] args) {     Dictionary&lt;string, object> tableDocumentProperties = new()     {         { Property.Version.ToString(), 1 },          { Property.Rows.ToString(), 10 },          { Property.Colls.ToString(), 5 },          { Property.Type.ToString(), \".xslx\" }     };      Dictionary&lt;string, object> textDocumentProperties = new()     {         { Property.Version.ToString(), 1 },          { Property.Chars.ToString(), 10000 },          { Property.Type.ToString(), \".docx\" },          {             Property.Parts.ToString(),             new List&lt;Dictionary&lt;string, object>>() { tableDocumentProperties }         }     };      TextDocument textDocument = new(textDocumentProperties);      Console.WriteLine(textDocument.GetType());      Console.WriteLine(textDocument.GetVersion());      Console.WriteLine(textDocument.GetChars());      var textDocumentParts = textDocument.GetParts() as List&lt;Dictionary&lt;string, object>>;      foreach (var part in textDocumentParts)     {         foreach (var item in part.Keys)         {             Console.WriteLine(item + \" \" + part[item]);         }     } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h2>\u041c\u043e\u043d\u0430\u0434\u0430 (Monad)<\/h2>\n<p>\u041f\u0430\u0442\u0442\u0435\u0440\u043d \u00ab\u041c\u043e\u043d\u0430\u0434\u0430\u00bb &#8212; \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0443\u0441\u043f\u0435\u0445\u0430 \u0438\u043b\u0438 \u043d\u0435\u0443\u0434\u0430\u0447\u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. <\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0448\u0430\u0433 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441 \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e, \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0448\u0430\u0433\u0438 \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u044b.<\/p>\n<details class=\"spoiler\">\n<summary>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">public class Validator&lt;T> {     private readonly T value;     private readonly List&lt;Exception> errors = new List&lt;Exception>();      public Validator(T value)     {         this.value = value;     }      public Validator&lt;T> Validate(Predicate&lt;T> validation, string message)     {         if (!validation(value))         {             errors.Add(new Exception(message));         }          return this;     }      public (bool, List&lt;string>) Get()     {         if (errors.Any())         {             List&lt;string> result = new List&lt;string>();              foreach (Exception e in errors)             {                 result.Add(e.Message);             }              return (false, result);         }          return (true, new List&lt;string>());     } }  public record User(string Name, string Surname, string Fathername) { }  private static void Main(string[] args) {     User fio = new(\"\u0418\u0432\u0430\u043d\", \"\u0418\u0432\u0430\u043d\u043e\u0432\u0438\u0447\", \"\u0418\u0432\u0430\u043d\u043e\u0432\");      Validator&lt;User> validator =          new Validator&lt;User>(fio)         .Validate(x => !string.IsNullOrEmpty(x.Name), \"Name is null\")         .Validate(x => !string.IsNullOrEmpty(x.Surname), \"Surname is null\")         .Validate(x => !string.IsNullOrEmpty(x.Fathername), \"Fathername is null\");      (bool, List&lt;string>) pair = validator.Get();      Console.WriteLine(pair.Item1); }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h2>\u041c\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 (Object Mother)<\/h2>\n<p>\u041f\u0430\u0442\u0442\u0435\u0440\u043d \u00ab\u041c\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\u00bb &#8212; \u044d\u0442\u043e \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0438\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u043c\u0438. \u041e\u0431\u044b\u0447\u043d\u043e \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430 \u0434\u043b\u044f \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0438 \u044e\u0440\u0438\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043b\u0438\u0446. \u0412 \u043e\u0431\u043e\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b, \u043d\u043e \u0443 \u043d\u0438\u0445 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432.<\/p>\n<details class=\"spoiler\">\n<summary>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">public class Developer {     private string? name;     private string? description;     private bool isCompany;      public void SetName(string name)     {         this.name = name;     }      public void SetDescription(string description)     {         this.description = description;     }      public void SetIsCompany(bool flag)     {         this.isCompany = flag;     } }  public static class DeveloperMother {     public static Developer CreatePerson(string name, string description)     {         Developer person = new();          person.SetName(name);          person.SetDescription(description);          person.SetIsCompany(false);          return person;     }      public static Developer CreateCompany(string name, string description)     {         Developer person = new();          person.SetName(name);          person.SetDescription(description);          person.SetIsCompany(true);          return person;     } }  private static void Main(string[] args) {     DeveloperMother.CreatePerson(\"Developer X\", \"Mobile apps\");     DeveloperMother.CreateCompany(\"VALVe\", \"CS:GO\"); }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h2>\u041f\u0443\u043b \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 (Object Pool)<\/h2>\n<p>\u041f\u0430\u0442\u0442\u0435\u0440\u043d \u00ab\u041f\u0443\u043b \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\u00bb &#8212; \u044d\u0442\u043e \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0438\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0440\u0430\u043d\u043d\u0435\u0435. \u041e\u043d \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u043a\u043e\u0433\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0442\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043a\u043b\u0438\u0435\u043d\u0442 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442, \u0442\u043e \u043f\u0443\u043b \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d \u0440\u0430\u043d\u044c\u0448\u0435. \u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442. \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043d\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/p>\n<details class=\"spoiler\">\n<summary>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">public class ObjectPool&lt;T> {     private readonly ConcurrentBag&lt;T> _objects;     private readonly Func&lt;T> _objectGenerator;      public ObjectPool(Func&lt;T> objectGenerator)     {         this._objectGenerator = objectGenerator ?? throw new ArgumentNullException(nameof(objectGenerator));         this._objects = new ConcurrentBag&lt;T>();     }      public T Get()     {         return this._objects.TryTake(out T item) ? item : this._objectGenerator();     }      public void Return(T item)     {         this._objects.Add(item);     } <\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-365225","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/365225","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=365225"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/365225\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=365225"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=365225"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=365225"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}