操作对象内部数据的正确方式:结合封装原则的编程实践疑问
问题解答
原实现的合理性判断
你贴的代码语法上可以正常运行,最终会输出Person's age:24,但不符合面向对象封装原则,也不算规范的工业级编程实现。
原因是你直接将Person类的age属性/字段暴露给外部随意修改,没有任何状态校验逻辑,很容易出现age=-1、age=200这类非法值,导致对象状态异常,后续排查问题成本极高。
符合封装原则的优化方案
封装的核心要求是:对象的内部状态只能由对象自身管控,对外仅暴露必要的操作接口,禁止外部直接修改对象内部属性。可以按以下步骤优化:
第一步:改造Person类,封装年龄的修改逻辑
public class Person { // 私有字段,禁止外部直接访问 private int _age; // 对外仅暴露只读属性,只能获取不能直接修改 public int Age { get => _age; } // 提供专门的公开方法修改年龄,内置合法性校验 public void SetAge(int age) { if (age < 0 || age > 120) { throw new ArgumentOutOfRangeException(nameof(age), "年龄需在0-120范围内"); } _age = age; } }
第二步:优化方法调用逻辑,有两种可选方向
方案1:保留传参逻辑,调用Person的公开方法修改属性
如果Method2的职责就是处理Person对象的相关逻辑,可以保留传参,但是修改为调用Person的公开方法操作属性:
void Method1() { Person person = new Person(); Method2(person); Console.WriteLine($"Person's age: {person.Age}"); } void Method2(Person p){ p.SetAge(24); }
方案2:改为无副作用的纯方法,降低耦合
如果Method2不需要绑定Person类,只是负责计算年龄结果,可以改造成带返回值的纯方法,由Method1自行给Person赋值,耦合度更低、更易单元测试:
void Method1() { Person person = new Person(); person.SetAge(Method2()); Console.WriteLine($"Person's age: {person.Age}"); } // 纯方法,无副作用,不需要依赖Person实例就能测试 int Method2(){ // 此处可扩展年龄的计算逻辑,示例直接返回24 return 24; }
内容的提问来源于stack exchange,提问作者Sillycrackers
相关产品推荐
相关产品推荐

