编写面向对象的代码时封装状态并公开行为

一个派。

你听说过吗? 由于某种原因,我的嘴在流水。

A delicious fresh-baked pie

A-PIE不仅是一种美味的烤甜点,里面有片状面包皮和温暖的粘糊糊,它是一个缩写/助记符,可以帮助您记住面向对象编程(OOP)的四个最重要的原则:

  • 一种抽象。P多态性。一世遗产。Ë封装。

封装形式这就是我今天要谈的 功能性似乎已成为令人兴奋的新事物,即使使用OOP语言,每个人都忘记了OOP。 让我们重新设置一点。 如果您使用OOP语言编写(很多),如果将OOP原则融入您的语言设计中,那么最糟糕的事情之一就是忘记它们。 这就像握住刀片的刀,然后尝试用手柄切奶酪。 你会被切成薄片!

另一种说法是,当您旁边有一条柏油路时,它将像沿着电源线行驶一辆'85本田思域。 这是另一个故事,但我和一个朋友尝试过一次,让我从经验中告诉您:这不是很漂亮,除非您想看到一些弯曲的金属...

抱歉! 在这里下车。 让我们回到封装。

So the concept of "data classes" has become quite vogue these days. Kotlin has direct support for data classes and Scala has case classes. These are JVM languages. Java has no direct equivalent, but it's interesting to note that both approaches are basically shortcut ways to create the classic JavaBean, which is a fancy word for a bag of data with public accessors and mutators.

C# gets at the same idea with automatic properties. If you look at the documentation for automatic properties, there's a prime example of the fly in my ointment today. In the example, a Customer class is defined, which is then mutated by code outside the class:

客户等级

// This class is mutable. Its data can be modified from
// outside the class.
class Customer
{
    // Auto-Impl Properties for trivial get and set
    public double TotalPurchases { get; set; }
    public string Name { get; set; }
    public int CustomerID { get; set; }

    // other code elided . . . 
}

程序:

class Program
{
    static void Main()
    {
        // Intialize a new object.
        Customer cust1 = new Customer ( 4987.63, "Northwind",90108 );

        //Modify a property
        cust1.TotalPurchases += 499.99;
    }
}

他们甚至在此处发表评论:此类是可变的。 可以从类外部修改其数据。

可耻,可耻,可耻我知道你的名字C#!!!!!!

这很简单面向对象的101!当目标是跟踪总购买量时,请将此功能公开显示为Customer类的公共行为,并封装使行为成为可能所需的数据。 该代码应类似于:

客户等级

// This class' data cannot be modified from outside the class.
class Customer
{
    private double TotalPurchases;
    private string Name;
    private int CustomerID;

    // other code elided . . . 

    public void AddPurchase( DollarAmount amt ) {
        TotalPurchase += amt;
    }
}

程序:

class Program
{
    static void Main()
    {
        Customer cust1 = new Customer ( 4987.63, "Northwind", 90108 );
        cust1.AddPurchase(499.99);
    }
}

看看如何顾客上课了私人的,私人的,私人的?

那就对了! 你应该保持私密性。 这显然不仅是我必须继续教我两岁的孩子但是相关的和永恒的适合所有年龄段程序员的格言。

现在,出于各种原因,您的私人隐私会受到保护。 一个很大的问题是,这使程序更容易开发! 我们很可能希望继续跟踪美元金额将来会更多。 我们也许想存储整个交易列表。

所以我不认识你,但是我宁愿a之以鼻,也不愿花我下午的时间来追踪所有关于采购总额然后让他们摆脱纠结的杂草,另一个程序员迷失了他们。在一个好的OO设计中,我们保持采购总额私有,这是一个一劳永逸的变化。 我会简单地更新顾客上课并免费获得所有进化!

当然是你的选择。没有人能告诉您如何编写代码。 如果您不认为在应用程序中将“数据类”与“行为类”分开会遇到麻烦,那么一定要做好。 但是请相信我,即使一次看到将手指插入电灯插座的感觉可能很有趣,您也不想再做一次。 如果我可以帮助您省去麻烦,那么我会感觉自己写了这篇文章就成了我的工作。 祝你好运!

from: https://dev.to//scottshipp/encapsulate-state-and-expose-behavior-when-writing-object-oriented-code-ea5

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值