рддрдХрдиреАрдХ: рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдмреАрдЪ рдХрд╛рд░реНрдп рдХрд░рдирд╛ (рдПрдоред рдлрд╛рдЙрд▓рд░ рд░реАрдлреИрдХреНрдЯрд░рд┐рдВрдЧ)

рдХреЛрдб рдХреЛ рдЪреЛрдХ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ
рддрдХрдиреАрдХ: рд░рдЪрдирд╛ рдХреЗ рддрд░реАрдХреЗ

рдкреБрд╕реНрддрдХ Refactoring рдХреЗ рд▓рд┐рдП рдирд┐рд░рдВрддрд░, рд░рд┐рдлреИрдХреНрдЯрд┐рдВрдЧ рддрдХрдиреАрдХ ред рдореМрдЬреВрджрд╛ рдХреЛрдб рдорд╛рд░реНрдЯрд┐рди рдлрд╛рдЙрд▓рд░ рдореЗрдВ рд╕реБрдзрд╛рд░ред

рд╕рд┐рдВрдЯреИрдХреНрд╕ C # рдореЗрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд╕рдордЭрдирд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдмреАрдЪ рдЧрддрд┐рдорд╛рди рдХрд╛рд░реНрдп


  1. рдПрдХ рд╡рд┐рдзрд┐ рд▓реЗ рдЬрд╛рдирд╛ ( рдХрдХреНрд╖рд╛ рдореЗрдВ рд╕рдорд╛рди рд╢рд░реАрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдирдИ рд╡рд┐рдзрд┐ рдмрдирд╛рдирд╛ рдЬреЛ рдЗрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ )ред
    рд╡рд┐рдзрд┐ рдПрдХ рдРрд╕реЗ рд╡рд░реНрдЧ рдореЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЕрдкрдиреЗ рд╡рд┐рд╖рдп рдХреНрд╖реЗрддреНрд░ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рджрд░реНрд╢рд╛рддреА рд╣реИред
    рд╕реЗ
    class View { private Shop shop; private List<User> FilterUsers(List<User> users, decimal koef) { List<User> activeUsers = new List<User>(); foreach(User user in users) { if(shop.IsActiveUser(user, koef)) { activeUsers.Add(user); } } return activeUsers; } } class Shop { public bool IsActiveUser(User user, decimal koef) { decimal rate = 1; if(koef > 1000) { rate = koef * 1.75; } return user.Boss || user.HasDiscount() && rate > 10; } } class User { private bool boss; public bool Boss { get { return boss; } } public bool HasDiscount() { // some condition } } 

    рдХреЛ
     class View { private Shop shop; private List<User> FilterUsers(List<User> users, decimal koef) { List<User> activeUsers = new List<User>(); foreach(User user in users) { if(user.IsActiveUser(koef)) { activeUsers.Add(user); } } return activeUsers; } } class Shop { } class User { private bool boss; public bool Boss { get { return boss; } } public bool HasDiscount() { // some condition } public bool IsActiveUser(decimal koef) { decimal rate = 1; if(koef > 1000) { rate = koef * 1,75; } return Boss || HasDiscount() && rate > 10; } } 

  2. рдПрдХ рдлрд╝реАрд▓реНрдб рдЪрд▓рдирд╛ ( рд▓рдХреНрд╖реНрдп рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рдирдпрд╛ рдлрд╝реАрд▓реНрдб рдмрдирд╛рдирд╛ )ред
    рдХреНрд╖реЗрддреНрд░ рдПрдХ рдРрд╕реЗ рд╡рд░реНрдЧ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЕрдкрдиреЗ рд╡рд┐рд╖рдп рдХреНрд╖реЗрддреНрд░ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ
    рд╕реЗ
     class Shop { private decimal rate; private DiscountType discountType; public Shop(DiscountType discountType, decimal rate) { this.rate = rate; this.discountType = discountType; } public decimal Rate { get{ return rate; } set{ rate = value; } } public bool HasDiscount(DateTime from, DateTime to) { // some calculation of flag return discountType.IsValid(rate) && flag; } public decimal GetDiscount(decimal amount, bool fullSum) { // some calculation of koef return discountType.GetAmount(rate, fullSum) * koef; } } class DiscountType { public bool IsValid(decimal rate) { // some calculation using rate } public decimal GetAmount(decimal rate, bool fullSum) { // some calculation using rate } } 

    рдХреЛ
     class Shop { private DiscountType discountType; public Shop(DiscountType discountType) { this.discountType = discountType; } public bool HasDiscount(DateTime from, DateTime to) { // some calculation of flag return discountType.IsValid() && flag; } public decimal GetDiscount(decimal amount, bool fullSum) { // some calculation of koef return discountType.GetAmount() * koef; } } class DiscountType { private decimal rate; public DiscountType(decimal rate) { this.rate = rate; } public decimal Rate { get{ return rate; } set{ rate = value; } } public bool IsValid() { // some calculation using rate } public decimal GetAmount(bool fullSum) { // some calculation using rate } } 

  3. рдПрдХ рдХрдХреНрд╖рд╛ рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рдирд╛ ( рдПрдХ рдирдпрд╛ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ рдФрд░ рдкреБрд░рд╛рдиреЗ рд╡рд░реНрдЧ рд╕реЗ рдирдП рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдлрд╝реАрд▓реНрдб рдФрд░ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ )ред
    рдХрдХреНрд╖рд╛ рдореЗрдВ рдЕрдкрдирд╛ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рдпрд╣ рдПрдХ рдИрд╢реНрд╡рд░ рд╡рд╕реНрддреБ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред
    рд╕реЗ
     class User { private string name; private string street; private string city; public string Name { get{ return name; } set{ name = value; } } public string Street { get{ return street; } set{ city = value; } } public string City { get{ return city; } set{ city = value; } } public string GetAddressInfo() { return string.Format("{0} \ {1}", city, street); } } 

    рдХреЛ
     class User { private string name; private Address address; public string Name { get{ return name; } set{ name = value; } } public string GetAddressInfo() { return address.GetFullAddress(); } } class Address { private string city; private string street; public string Street { get{ return street; } set{ city = value; } } public string City { get{ return city; } set{ city = value; } } public string GetFullAddress() { return string.Format("Adress: {0} \ {1}", city, street); } } 

  4. рдПрдХ рд╡рд░реНрдЧ рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдирд╛ ( рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рджреВрд╕рд░реЗ рд╡рд░реНрдЧ рдореЗрдВ рд▓реЗ рдЬрд╛рдирд╛ рдФрд░ рдореВрд▓ рдХреЛ рд╣рдЯрд╛рдирд╛ )ред
    рдПрдХ рд╡рд░реНрдЧ рдХреЗ рдкрд╛рд╕ рдмрд╣реБрдд рдХрдо рдХрд╛рд░реНрдп рд╣реИрдВред
    рд╕реЗ
     class User { private string name; private Address address; public string Name { get{ return name; } set{ name = value; } } public Address GetAddress() { return address } } class Address { private string areaCode; private string country; public string AreaCode { get{ return areaCode; } set{ areaCode = value; } } public string Country { get{ return country; } set{ country = value; } } } 

    рдХреЛ
     class User { private string name; private string areaCode; private string country; public string AreaCode { get{ return areaCode; } set{ areaCode = value; } } public string Country { get{ return country; } set{ country = value; } } public string Name { get{ return name; } set{ name = value; } } } 

  5. рдкреНрд░рддрд┐рдирд┐рдзрд┐рдордВрдбрд▓ рдХреЛ рдЫрд┐рдкрд╛рдирд╛ ( рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдмрдирд╛рдирд╛ )ред
    рдПрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди, рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЗред
    рд╕реЗ
     class View { private void Init() { // some code User manager = currentUser.Office.Manager; } } class User { private Department department; public Department Office { get{ return department; } set{ department = value; } } } class Department { private User manager; public Department(User manager) { this.manager = manager; } public User Manager { get{ return manager; } } } 

    рдХреЛ
     class View { private void Init() { // some code User manager = currentUser.Manager; } } class User { private Department department; public User Manager { get{ return department.Manager; } } } class Department { private User manager; public Department(User manager) { this.manager = manager; } public User Manager { get{ return manager; } } } 

  6. рдмреНрд░реЛрдХрд░ рдХреЛ рд╣рдЯрд╛рдирд╛ ( рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╕реЗ рд╕реАрдзреЗ рд╕рдВрдкрд░реНрдХ рдХрд░реЗрдВ )ред
    рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рддрд┐рдирд┐рдзрд┐рдордВрдбрд▓ рдХреЗ рд╕рд╛рде рд╡рд░реНрдЧ рдмрд╣реБрдд рд╡реНрдпрд╕реНрдд рд╣реИред
    рд╕реЗ
     class View { private void Init() { // some code User manager = currentUser.Manager; decimal rate = currentUser.Rate; } } class User { private Department department; private UserType userType; public User Manager { get{ return department.Manager; } } public decimal Rate { get{ return userType.Rate; } } } class Department { private User manager; public User Manager { get{ return manager; } } } class UserType { private decimal rate; public decimal Rate { get{ return rate; } } } 

    рдХреЛ
     class View { private void Init() { // some code User manager = currentUser.Office.Manager; decimal rate = currentUser.Type.Rate; } } class User { private Department department; private UserType userType; public Department Office { get{ return department; } } public UserType Type { get{ return userType; } } } class Department { private User manager; public User Manager { get{ return manager; } } } class UserType { private decimal rate; public decimal Rate { get{ return rate; } } } 

  7. рдПрдХ рдмрд╛рд╣рд░реА рд╡рд┐рдзрд┐ рдХрд╛ рдкрд░рд┐рдЪрдп ( рдХреНрд▓рд╛рдЗрдВрдЯ рдореЗрдВ, рдПрдХ рд╡рд┐рдзрд┐ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рд░реНрд╡рд░ рд╡рд░реНрдЧ рдХреЛ 1 рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ )ред
    рдПрдХ рд╡рд┐рдзрд┐ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдХреНрд╖рд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрдИ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред
    рд╕реЗ
     class View { private string GetUserName() { // some code return "\"" + userName + "\""; } private string GetCompanyName() { // some code return "\"" + companyName + "\""; } } 

    рдХреЛ
     class View { private string GetUserName() { // some code return userName.InDoubleQuote(); } private string GetCompanyName() { // some code return companyName.InDoubleQuote(); } } static class StringExtension { public static string InDoubleQuote(this string str) { return "\"" + str + "\""; } } 

  8. рдПрдХ рд╕реНрдерд╛рдиреАрдп рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╛ рдкрд░рд┐рдЪрдп ( рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдг рдмрдирд╛рдПрдВ (рдпрд╛ рд╡рд┐рд░рд╛рд╕рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдФрд░ рдЖрд╡рд╢реНрдпрдХ рддрд░реАрдХреЛрдВ рд╕реЗ рдЗрд╕реЗ рдкреВрд░рдХ рдХрд░реЗрдВ )ред
    рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдХрдХреНрд╖рд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред
    рд╕реЗ
     sealed class Account { public decimal CalculateSum() { // calculation summ return summ; } } 

    рдХреЛ
     class ImportantAccount { private Account account; public decimal CalculateMaxSum() { // calculation rate return account.CalculateSum() * rate; } } 


рд╣рд┐рддреЛрдВ рдХрд╛ рдЯрдХрд░рд╛рд╡ (рд╕рдореАрдХреНрд╖рд╛ рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ)ред


рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рд╕рдореАрдХреНрд╖рдХ рдФрд░ рдХреЙрдорд┐рдЯ-рдЗрд░реЗрдЯ рдХреЗ рдмреАрдЪ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд╡рд┐рд╡рд╛рдж / рдЕрд╕рд╣рдорддрд┐ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

рдореИрдВ рдЖрдЧреЗ "рддрдХрдиреАрдХ: рдбреЗрдЯрд╛ рд╕рдВрдЧрдарди" рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВред

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


All Articles