重构代码之将引用范例更改为值范例

打印 上一主题 下一主题

主题 822|帖子 822|积分 2466

将引用范例更改为值范例的目的是将引用范例转换为值范例,通常是为了简化代码,减少副作用,进步代码的可明白性和可维护性。这个重构技能实用于那些引用范例在某些情况下表现得像值范例的场景,尤其是当引用范例不需要共享状态时。通过这种方式,可以制止复杂的引用管理,减少不须要的共享状态。
一、何时使用将引用范例更改为值范例



  • 制止共享状态:如果引用范例的实例被多个对象共享,而且没有须要共享它的状态,使用值范例可以制止这种复杂的引用管理。
  • 减少副作用:引用范例在多个地方共享时,如果一个地方修改了对象的状态,大概会影响到其他地方的行为。使用值范例可以制止这种副作用。
  • 简化设计:如果对象的生命周期不需要跨多个实例共享,可以通过使用值范例来简化设计。
二、如何进行将引用范例更改为值范例


  • 确定要转换的对象:起首需要识别出一个对象实例,它在代码中是以引用范例存在,但现实上不需要跨多个对象共享状态。
  • 转换范例

    • 如果这个引用范例是类(class),可以思量将它转换为布局体(struct)。布局体是值范例,每次赋值或传递时都会创建一个副本,而不会影响其他地方的实例。
    • 如果是某些简单的值对象,可以直接替换为一个值范例,例如整数、浮点数、布尔值等。

  • 修改引用的地方

    • 需要更新使用该对象的所有地方,确保它们如今使用的是值范例。
    • 如果原来是通过引用修改对象的属性,转为值范例后需要通过传值的方式更新,大概需要调整一些逻辑。

  • 测试和验证

    • 确保重构后的代码行为和之前一致,且没有引入新的错误或副作用。
    • 尤其留意原本共享状态的地方,如今值范例应该不再影响其他地方的状态。

三、示例

假设有一个类 Person,它包含一个 Address 类作为属性,如今我们想将 Address 类从引用范例转换为值范例。
原始代码:
  1. public class Address
  2. {
  3.     public string Street { get; set; }
  4.     public string City { get; set; }
  5. }
  6. public class Person
  7. {
  8.     public Address Address { get; set; }
  9.     public Person(string street, string city)
  10.     {
  11.         Address = new Address { Street = street, City = city };
  12.     }
  13. }
  14. public class Program
  15. {
  16.     public static void Main()
  17.     {
  18.         var person1 = new Person("123 Main St", "Springfield");
  19.         var person2 = new Person("456 Oak St", "Shelbyville");
  20.         
  21.         person1.Address.Street = "789 Elm St"; // 影响了 person2 的 Address
  22.     }
  23. }
复制代码
在这个例子中,Address 是引用范例,因此对 person1.Address 的修改会影响到其他引用同一个 Address 对象的地方。
重构后:
  1. public struct Address
  2. {
  3.     public string Street { get; set; }
  4.     public string City { get; set; }
  5. }
  6. public class Person
  7. {
  8.     public Address Address { get; set; }
  9.     public Person(string street, string city)
  10.     {
  11.         Address = new Address { Street = street, City = city };
  12.     }
  13. }
  14. public class Program
  15. {
  16.     public static void Main()
  17.     {
  18.         var person1 = new Person("123 Main St", "Springfield");
  19.         var person2 = new Person("456 Oak St", "Shelbyville");
  20.         
  21.         person1.Address.Street = "789 Elm St"; // 不会影响 person2 的 Address
  22.     }
  23. }
复制代码
在重构后的代码中,Address 是一个值范例(struct),因此每次 Person 对象被创建时,Address 都会被复制,而不是引用共享。因此,对 person1.Address 的修改不会影响 person2.Address。
四、留意事项



  • 性能影响:虽然值范例通常比引用范例更简单,但它们也有一定的性能开销,尤其是当它们很大时。因为每次传递值范例时,都会进行复制,大概会导致性能下降。在这种情况下,选择是否进行重构需要综合思量性能和代码的清晰度。
  • 不可变性:值范例通常是不可变的,这意味着它们一旦创建就不能改变。对于需要频仍修改的对象,值范例大概不得当。
五、总结

将引用范例更改为值范例重构通过将引用范例转换为值范例来简化代码设计,减少共享状态和副作用。它实用于那些不需要共享状态的场景,可以或许进步代码的可读性和可维护性,但也需要留意性能和设计方面的影响。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

九天猎人

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表