рдкреНрд░рдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдбрд┐рдЬрд╝рд╛рдЗрди: рдЕрдорд╛рдиреНрдп рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ C # рдореЗрдВ рдЕрдХреНрд╖рдореНрдп рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП

рдЖрдорддреМрд░ рдкрд░, рдЯрд╛рдЗрдк рдбрд┐рдЬрд╝рд╛рдЗрдирд┐рдВрдЧ рдХреЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рд╣реЛрддреЗ рд╣реИрдВ - рд╣рд╛рд╕реНрдХреЗрд▓, рдПрдл #, рдФрд░ рдЕрдиреНрдпред рдпрд╣ рдЕрд╡рдзрд╛рд░рдгрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рднрд╛рд╖рд╛рдУрдВ рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рд╕реНрдХреЙрдЯ рд╡реНрд▓рд╛рд╕рдЪрд┐рди рдЯрд╛рдЗрдк рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗ рдПрдХ рд▓реЗрдЦ рд╕реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░реВрдВрдЧрд╛ : рдХреИрд╕реЗ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рд╕реА # рдореЗрдВ рдЕрдорд╛рдиреНрдп рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рдЕрдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛рдП ред рдореИрдВ рдпрд╣ рднреА рджрд┐рдЦрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рди рдХреЗрд╡рд▓ рдкреНрд░рдпреЛрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рд╣реИ, рдмрд▓реНрдХрд┐ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдореЗрдВ рднреА рд╣реИред


рдбреЛрдореЗрди рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдПрдБ


рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдПрдл # рдореЗрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред


рдбреЛрдореЗрди рдореЗрдВ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рд▓рдкреЗрдЯреЗрдВ


F # рдЙрджрд╛рд╣рд░рдг рдИрдореЗрд▓ рдкрддреЗ, рдпреВрдПрд╕ рдЬрд╝рд┐рдк рдХреЛрдб рдФрд░ рд░рд╛рдЬреНрдп рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЖрджрд┐рдо рдХреЗ рдмрдЬрд╛рдп рдбреЛрдореЗрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЖрдЗрдП C # рдореЗрдВ рдПрдХ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:


public sealed class EmailAddress { public string Value { get; } public EmailAddress(string value) { if (value == null) { throw new ArgumentNullException(nameof(value)); } if (!Regex.IsMatch(value, @"^\S+@\S+\.\S+$")) { throw new ArgumentException("Email address must contain an @ sign"); } Value = value; } public override string ToString() => Value; public override bool Equals(object obj) => obj is EmailAddress otherEmailAddress && Value.Equals(otherEmailAddress.Value); public override int GetHashCode() => Value.GetHashCode(); public static implicit operator string(EmailAddress address) => address?.Value; } 

 var a = new EmailAddress("a@example.com"); var b = new EmailAddress("b@example.com"); var receiverList = String.Join(";", a, b); 

рдореИрдВрдиреЗ рдлрд╝реИрдХреНрдЯрд░реА рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд▓реЗрдХрд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рддрдХ рдкрддрд╛ рд╕рддреНрдпрд╛рдкрди рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди C # рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИред рд╣рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рддреБрд▓рдирд╛ рдФрд░ рд░реВрдкрд╛рдВрддрд░рдг рдХреЛ рднреА рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдерд╛, рдЬреЛ рд╕рдВрдХрд▓рдХ рдкрд░ рдПрдл # рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


рдПрдХ рдУрд░, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛рдлреА рдмрдбрд╝рд╛ рджрд┐рдЦрддрд╛ рд╣реИред рджреВрд╕рд░реА рдУрд░, рдИрдореЗрд▓ рдкрддреЗ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдХреЗрд╡рд▓ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдЪреЗрдХ рджреНрд╡рд╛рд░рд╛ рдФрд░ рд╕рдВрднрд╡рддрдпрд╛, рддреБрд▓рдирд╛рддреНрдордХ рддрд░реНрдХ рджреНрд╡рд╛рд░рд╛ рд╡реНрдпрдХреНрдд рдХреА рдЬрд╛рддреА рд╣реИред рдЗрд╕рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЛрдб рд╣реИ, рдЬреЛ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдмрджрд▓рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред рддреЛ, рдЖрдк рдпрд╛ рддреЛ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛, рд╕рдмрд╕реЗ рдЦрд░рд╛рдм, рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рдХреЛ рдХрдХреНрд╖рд╛ рд╕реЗ рдХрдХреНрд╖рд╛ рдореЗрдВ рдХреЙрдкреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЖрджрд┐рдо рдореВрд▓реНрдпреЛрдВ рд╕реЗ рдбреЛрдореЗрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдУрдУрдкреА рдореЗрдВ рдЦрд░рд╛рдм рдХреЛрдб рдХрд╛ рд╕рдВрдХреЗрдд рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЗ рд░реИрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, NLog рдФрд░ NBitcoin рдореЗрдВ , рдФрд░ TimeSpan рдХрд╛ рдорд╛рдирдХ рдкреНрд░рдХрд╛рд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЯрд┐рдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдПрдХ рдЖрд╡рд░рдг рд╣реИред


рдорд╛рди рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛


рдЕрдм рд╣рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


 public sealed class EmailContactInfo { public EmailAddress EmailAddress { get; } public bool IsEmailVerified { get; } public EmailContactInfo(EmailAddress emailAddress, bool isEmailVerified) { if (emailAddress == null) { throw new ArgumentNullException(nameof(emailAddress)); } EmailAddress = emailAddress; IsEmailVerified = isEmailVerified; } public override string ToString() => $"{EmailAddress}, {(IsEmailVerified ? "verified" : "not verified")}"; } 

рдлрд┐рд░, рдПрдл # рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдХреЛрдб рд▓рд┐рдпрд╛ рдЧрдпрд╛, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛рдо рдЖрдИрдбреАрдИ рдореЗрдВ рд░рд┐рдлреИрдХреНрдЯрд┐рдВрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


EmailAddress рддрд░рд╣, EmailContactInfo рдПрдХ рдорд╛рди рдСрдмреНрдЬреЗрдХреНрдЯ ( DDD рдХреЗ рдЕрд░реНрде рдореЗрдВ, .NET рдореЗрдВ рдорд╛рди рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ), рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЬреНрдЮрд╛рдд рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЙрдбрд▓рд┐рдВрдЧ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ - StateCode , StateCode , PostalAddress рдФрд░ PersonalName рдПрдХ рд╕рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ C # рдореЗрдВ рдкреЛрд░реНрдЯ PersonalName ред


рд╕рдВрдкрд░реНрдХ рдмрдирд╛рдПрдБ


рдЗрд╕рд▓рд┐рдП, рдХреЛрдб рдХреЛ рдирд┐рдпрдо рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП "рд╕рдВрдкрд░реНрдХ рдореЗрдВ рдПрдХ рдИрдореЗрд▓ рдкрддрд╛ рдпрд╛ рдПрдХ рдбрд╛рдХ рдкрддрд╛ (рдпрд╛ рджреЛрдиреЛрдВ рдкрддреЗ) рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред" рдЗрд╕ рдирд┐рдпрдо рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рд░рд╛рдЬреНрдп рдХреА рд╢реБрджреНрдзрддрд╛ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗ рдФрд░ рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рдПред


рд╡рд┐рднрд┐рдиреНрди рд╕рдВрдкрд░реНрдХ рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░реЗрдВ


рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдХ рд╕рдВрдкрд░реНрдХ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдирд╛рдо рдФрд░ рдПрдХ рдИрдореЗрд▓ рдкрддреЗ, рдпрд╛ рдПрдХ рдбрд╛рдХ рдкрддреЗ, рдпрд╛ рджреЛрдиреЛрдВ рд╕реЗ рдпреБрдХреНрдд рдПрдХ рд╡рд╕реНрддреБ рд╣реИред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдПрдХ рд╡рд░реНрдЧ рдореЗрдВ рдЧреБрдгреЛрдВ рдХреЗ рддреАрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП, рддреАрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд░реНрдЧреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рднреА рддреАрди рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╕рдВрдкрд░реНрдХ рдХрд╛ рдирд╛рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдкрд░реНрдХреЛрдВ рдХреЛ рдПрдХ рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рдпрд╣ рдЬрд╛рдирдирд╛ рдХрд┐ рдХреМрди рд╕реЗ рдкрддреЗ рдореЗрдВ рд╕рдВрдкрд░реНрдХ рд╢рд╛рдорд┐рд▓ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╕рдВрдкрд░реНрдХ рдХреЛ рдПрдХ рд╕рд╛рд░ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрдкрд░реНрдХ рдХрд╛ рдирд╛рдо, рдФрд░ рддреАрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдлрд╝реАрд▓реНрдб рдХреЗ рдПрдХ рдЕрд▓рдЧ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рд╣реЛрдЧрд╛ред


 public abstract class Contact { public PersonalName Name { get; } protected Contact(PersonalName name) { if (name == null) { throw new ArgumentNullException(nameof(name)); } Name = name; } } public sealed class PostOnlyContact : Contact { private readonly PostalContactInfo post_; public PostOnlyContact(PersonalName name, PostalContactInfo post) : base(name) { if (post == null) { throw new ArgumentNullException(nameof(post)); } post_ = post; } } public sealed class EmailOnlyContact : Contact { private readonly EmailContactInfo email_; public EmailOnlyContact(PersonalName name, EmailContactInfo email) : base(name) { if (email == null) { throw new ArgumentNullException(nameof(email)); } email_ = email; } } public sealed class EmailAndPostContact : Contact { private readonly EmailContactInfo email_; private readonly PostalContactInfo post_; public EmailAndPostContact(PersonalName name, EmailContactInfo email, PostalContactInfo post) : base(name) { if (email == null) { throw new ArgumentNullException(nameof(email)); } if (post == null) { throw new ArgumentNullException(nameof(post)); } email_ = email; post_ = post; } } 

рдЖрдк рддрд░реНрдХ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП , рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХрд╛ рдирд╣реАрдВ, рдФрд░ рдЖрдо рддреМрд░ рдкрд░ рдЖрдкрдХреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдбреЗрдЯрд╛ рдХреА рдирд╣реАрдВред рдЯрд┐рдкреНрдкрдгреА рдЙрдЪрд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╡рд░реНрдЧ рдкрджрд╛рдиреБрдХреНрд░рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣рд╛рдБ рдЙрдЪрд┐рдд рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЙрдкрд╡рд░реНрдЧ рди рдХреЗрд╡рд▓ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдХреЗ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ, рдкреВрд░реА рдкрджрд╛рдиреБрдХреНрд░рдо рдПрдХ рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ - рд╕рдВрдкрд░реНрдХред рддреАрди рд╕рдВрдкрд░реНрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╣реБрдд рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рд╡реНрдпрд╛рдкрд╛рд░ рдирд┐рдпрдо рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рддреАрди рдорд╛рдорд▓реЛрдВ рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВред рджреВрд╕рд░реЗ, рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдФрд░ рдЙрд╕рдХреЗ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░рд┐рдпреЛрдВ рдХреЗ рд╕рдВрдмрдВрдз, рдЙрдирдХреЗ рдмреАрдЪ рдЬрд┐рдореНрдореЗрджрд╛рд░рд┐рдпреЛрдВ рдХрд╛ рд╡рд┐рднрд╛рдЬрди рдЖрд╕рд╛рдиреА рд╕реЗ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рддреАрд╕рд░рд╛, рдпрджрд┐ рдкрджрд╛рдиреБрдХреНрд░рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдмрди рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдк рд╕рдВрдкрд░реНрдХ рд░рд╛рдЬреНрдп рдХреЛ рдПрдХ рдЕрд▓рдЧ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдореВрд▓ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдПрдл # рдореЗрдВ, рдЕрднрд┐рд▓реЗрдЦреЛрдВ рдХрд╛ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░ рдЕрд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдирдП рдкреНрд░рдХрд╛рд░ рдХрд╛рдлреА рд╕рд░рд▓ рд░реВрдк рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рднрд╛рдЬрди рддреБрд░рдВрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред C # рдореЗрдВ, рдЖрдзрд╛рд░ рдлрд╝реАрд▓реНрдб рдореЗрдВ рдирд╛рдо рдлрд╝реАрд▓реНрдб рдХреЛ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдзрд┐рдХ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╕рдорд╛рдзрд╛рди рд╣реЛрдЧрд╛ред


рд╕рдВрдкрд░реНрдХ рдмрдирд╛рдПрдБ


рд╕рдВрдкрд░реНрдХ рдмрдирд╛рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред


 public abstract class Contact { public static Contact FromEmail(PersonalName name, string emailStr) { var email = new EmailAddress(emailStr); var emailContactInfo = new EmailContactInfo(email, false); return new EmailOnlyContact(name, emailContactInfo); } } 

 var name = new PersonalName("A", null, "Smith"); var contact = Contact.FromEmail(name, "abc@example.com"); 

рдпрджрд┐ рдИрдореЗрд▓ рдкрддрд╛ рдЧрд▓рдд рд╣реИ, рддреЛ рдпрд╣ рдХреЛрдб рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджреЗрдЧрд╛, рдЬрд┐рд╕реЗ рдореВрд▓ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ None рд╡рд╛рдкрд╕реА рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рд╕рдВрдкрд░реНрдХ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ


рдХрд┐рд╕реА рд╕рдВрдкрд░реНрдХ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рднреА рд╕реАрдзрд╛ рд╣реИ - рдЖрдкрдХреЛ рдмрд╕ Contact рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдПрдХ рдЕрдореВрд░реНрдд рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


 public abstract class Contact { public abstract Contact UpdatePostalAddress(PostalContactInfo newPostalAddress); } public sealed class EmailOnlyContact : Contact { public override Contact UpdatePostalAddress(PostalContactInfo newPostalAddress) => new EmailAndPostContact(Name, email_, newPostalAddress); } public sealed class PostOnlyContact : Contact { public override Contact UpdatePostalAddress(PostalContactInfo newPostalAddress) => new PostOnlyContact(Name, newPostalAddress); } public sealed class EmailAndPostContact : Contact { public override Contact UpdatePostalAddress(PostalContactInfo newPostalAddress) => new EmailAndPostContact(Name, email_, newPostalAddress); } 

 var state = new StateCode("CA"); var zip = new ZipCode("97210"); var newPostalAddress = new PostalAddress("123 Main", "", "Beverly Hills", state, zip); var newPostalContactInfo = new PostalContactInfo(newPostalAddress, false); var newContact = contact.UpdatePostalAddress(newPostalContactInfo); 

рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВред рдПрдл # рдореЗрдВ, рдИрдореЗрд▓ рдкрддреЗ, рдЬрд╝рд┐рдк рдХреЛрдб, рдпрд╛ рд░рд╛рдЬреНрдп рдЧрд▓рдд рд╣реИ, рддреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реЛрдВ рд╕реЗ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реА # рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдЖрдо рдмрд╛рдд рд╣реИред рдмреЗрд╢рдХ, рдЕрдкрд╡рд╛рдж рдХреЛрдб рдпрд╣рд╛рдБ рдХрд╛рдо рдХреЛрдб рдореЗрдВ рдпрд╛ рдХрд╣реАрдВ рдХреЙрд▓рд┐рдВрдЧ рдХреЛрдб рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред


рд╕рдВрдкрд░реНрдХ рдХреЛ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рдмрд╛рд╣рд░ рд╕рдВрднрд╛рд▓рдирд╛


Contact рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдХрд┐рд╕реА рд╕рдВрдкрд░реНрдХ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдХреЛ рд░рдЦрдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдЖрдк рдХреБрдЫ рдРрд╕рд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдЙрд╕рдХреЗ рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░реА рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдлрд┐рдЯ рди рд╣реЛ? рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рд╕рдВрдкрд░реНрдХ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред


рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдлрд┐рд░ рд╕реЗ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдЕрдореВрд░реНрдд рдкрджреНрдзрддрд┐ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╣рд░ рдмрд╛рд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдлрд┐рд░ рдПрдХрдорд╛рддреНрд░ рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, Contact рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЛ рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ Contact рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╕реНрдерд╛рдиреЛрдВ рдХреЗ рдмреАрдЪ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рддрд░реНрдХ рдХреЛ рдзреБрдВрдзрд▓рд╛ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред F # рдореЗрдВ рдРрд╕реА рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдереА, рдореИрдВ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ C # рдХреЛрдб рдХреЛрдИ рдЦрд╝рд░рд╛рдм рди рд╣реЛ!


C # рдореЗрдВ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреИрдЯрд░реНрди рдХреЗ рд╕рдмрд╕реЗ рдирдЬрд╝рджреАрдХреА рд╕реНрд╡рд┐рдЪ рдирд┐рд░реНрдорд╛рдг рд╣реИред рд╣рдо Contact рдПрдХ рд╕рдВрд▓рдЧреНрди рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдкрд░реНрдХ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдФрд░ рд░реВрдкрд╛рдВрддрд░рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рд╕реА # рдХреА рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ Contact рдХреА рдПрдХ рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди, рдЖрдЦрд┐рд░рдХрд╛рд░, рд╣рдо рдЪрд╛рд╣рддреЗ рдереЗ рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдирдП рдкреНрд░реЙрдореНрдкреНрдЯ рд╕реНрдЯреЗрдЯреНрд╕ рдЬреБрдбрд╝рдиреЗ рдкрд░ рдЦреБрдж рдХреЛ рдкреНрд░реЙрдореНрдкреНрдЯ рдХрд░реЗ, рдЬрд╣рд╛рдВ рдирдП рдорд╛рдорд▓реЛрдВ рдХреА рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╕реНрд╡рд┐рдЪ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдорд╛рдорд▓реЛрдВ рдХреА рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред


рд▓реЗрдХрд┐рди OOP рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рддрд░реНрдХ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрдВрддреНрд░ рднреА рд╣реИ, рдФрд░ рд╣рдордиреЗ рдХрд┐рд╕реА рд╕рдВрдкрд░реНрдХ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╕рдордп рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдФрд░ рдЪреВрдВрдХрд┐ рдЕрдм рд╡рд┐рдХрд▓реНрдк рдХреЙрд▓рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдкреЙрд▓реАрдореЙрд░реНрдлрд┐рдХ рднреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рдорд╛рдзрд╛рди рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ Contact рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд╕рдВрдкрд░реНрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдЙрдирдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рд╕реЗ рд╣рдЯрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдВрдкрд░реНрдХ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░, рддрджрдиреБрд╕рд╛рд░, рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдПрдХ рдирдпрд╛ рддрд░реАрдХрд╛, рдЖрдкрдХреЛ рдЗрд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рд╕рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ!


 public abstract class Contact { public abstract void AcceptVisitor(IContactVisitor visitor); } public interface IContactVisitor { void Visit(PersonalName name, EmailContactInfo email); void Visit(PersonalName name, PostalContactInfo post); void Visit(PersonalName name, EmailContactInfo email, PostalContactInfo post); } public sealed class EmailOnlyContact : Contact { public override void AcceptVisitor(IContactVisitor visitor) { if (visitor == null) { throw new ArgumentNullException(nameof(visitor)); } visitor.Visit(Name, email_); } } public sealed class PostOnlyContact : Contact { public override void AcceptVisitor(IContactVisitor visitor) { if (visitor == null) { throw new ArgumentNullException(nameof(visitor)); } visitor.Visit(Name, post_); } } public sealed class EmailAndPostContact : Contact { public override void AcceptVisitor(IContactVisitor visitor) { if (visitor == null) { throw new ArgumentNullException(nameof(visitor)); } visitor.Visit(Name, email_, post_); } } 

рдЕрдм рдЖрдк рд╕рдВрдкрд░реНрдХ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХрдВрд╕реЛрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред


 public sealed class ContactUi { private sealed class Visitor : IContactVisitor { void IContactVisitor.Visit(PersonalName name, EmailContactInfo email) { Console.WriteLine(name); Console.WriteLine("* Email: {0}", email); } void IContactVisitor.Visit(PersonalName name, PostalContactInfo post) { Console.WriteLine(name); Console.WriteLine("* Postal address: {0}", post); } void IContactVisitor.Visit(PersonalName name, EmailContactInfo email, PostalContactInfo post) { Console.WriteLine(name); Console.WriteLine("* Email: {0}", email); Console.WriteLine("* Postal address: {0}", post); } } public void Display(Contact contact) => contact.AcceptVisitor(new Visitor()); } 

 var ui = new ContactUi(); ui.Display(newContact); 

рдФрд░ рд╕реБрдзрд╛рд░


рдпрджрд┐ Contact рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЧреНрд░рд╛рд╣рдХреЛрдВ рдореЗрдВ рдирдП рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░рд┐рдпреЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдЕрд╡рд╛рдВрдЫрдиреАрдп рд╣реИ, рддреЛ рдЖрдк Contact рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рджрд╛рдпрд░реЗ рдХреЛ internal рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕рдХреЗ рд╡рдВрд╢рдЬреЛрдВ рдХреЛ рдиреЗрд╕реНрдЯреЗрдб рд╡рд░реНрдЧ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ private рдХреА рджреГрд╢реНрдпрддрд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдХреЗрд╡рд▓ рд╕реНрдереИрддрд┐рдХ рдХрд╛рд░рдЦрд╛рдиреЗ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред


 public abstract class Contact { private sealed class EmailOnlyContact : Contact { public EmailOnlyContact(PersonalName name, EmailContactInfo email) : base(name) { } } private Contact(PersonalName name) { } public static Contact EmailOnly(PersonalName name, EmailContactInfo email) => new EmailOnlyContact(name, email); } 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЯрд╛рдЗрдк-рдпреЛрдЧ рдХреА рдЧреИрд░-рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд┐рд▓рд┐рдЯреА рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред


рдирд┐рд╖реНрдХрд░реНрд╖


рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдореИрдВ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ рдХрд┐ рдУрдУрдкреА рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рдХреА рд╕рд╣реА рд╕реНрдерд┐рддрд┐ рдХреЛ рдХреИрд╕реЗ рд╕реАрдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдХреЛрдб F # рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЪрдордХреАрд▓рд╛ рдирд┐рдХрд▓рд╛ред рдХрд╣реАрдВ рдпрд╣ рдУрдУрдкреА рдирд┐рд░реНрдгрдпреЛрдВ рдХреА рд╕рд╛рдкреЗрдХреНрд╖ рдмреЛрдЭрд┐рд▓рддрд╛ рдХреЗ рдХрд╛рд░рдг рд╣реИ, рддреЛ рдХрд╣реАрдВ рднрд╛рд╖рд╛ рдХреА рд╕рддреНрдпрддрд╛ рдХреЗ рдХрд╛рд░рдг, рд▓реЗрдХрд┐рди рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЛ рдЕрд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ред


рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рд╢реБрд░реВ, рд╣рдо рд╡рд┐рд╖рдп-рдЙрдиреНрдореБрдЦ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдФрд░ рдУрдУрдкреА рдкреИрдЯрд░реНрди рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреЗ рд╕рд╛рде рдЖрдПред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЯрд╛рдЗрдк-рд╕рдореНрд╕ рдФрд░ рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдкреИрдЯрд░реНрди рдХреА рд╕рдорд╛рдирддрд╛ рдХрд╛рдлреА рд╕рдордп рд╕реЗ рдЬрд╛рдиреА рдЬрд╛рддреА рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЗрддрдирд╛ рдмрдбрд╝рд╛ рдареЛрд╕ рдкреНрд░рджрд░реНрд╢рди рдирд╣реАрдВ рдерд╛ рдЬреИрд╕рд╛ рдХрд┐ рдЕрдкреВрд░реНрдг рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ "рд╣рд╛рдереА рджрд╛рдВрдд" рд╕реЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреА рдкреНрд░рдпреЛрдЬреНрдпрддрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╣реИред рдмреЗрд╢рдХ, рд╣рд░ рдЪреАрдЬ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЦреНрдпрдзрд╛рд░рд╛ рдХреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХрддрд╛ рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде, рд▓рд╛рдЧреВ рдХреА рд╕реАрдорд╛рдУрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реЛрдЧрд╛ред




тЖТ рдирдореВрдирд╛ рдХреЛрдб GitHub рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ

Source: https://habr.com/ru/post/hi431186/


All Articles