You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

操作对象内部数据的正确方式:结合封装原则的编程实践疑问

问题解答

原实现的合理性判断

你贴的代码语法上可以正常运行,最终会输出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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 06:15:05