首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >代码整洁之道-对象和数据结构

代码整洁之道-对象和数据结构

作者头像
烟草的香味
发布2019-09-25 15:32:32
发布2019-09-25 15:32:32
4760
举报
文章被收录于专栏:烟草的香味烟草的香味

现在,有一个计算面积的需求,其中一种实现如下:

代码语言:javascript
复制
class Square{
    public $side;
}
class Geometry{
    public function area($shape){
        if($shape instanceof Square){
            return $shape->side * $shape->side;
        }
        return 0;
    }
}

有人看了,你这抽象的有问题啊,很明显是面向过程的,如果新加一个类型,Geometry类中的所有方法都要修改。嗯,却是是这样,但反过来想,如果新加一个方法,所有现有的形状类都不用动,只要在Geometry类中添加方法就行了。

当然了,还有一种多态的实现方式:

代码语言:javascript
复制
class Square implements Shape{
    private $side;
    public function area(){
        return $this->side * $this->side;
    }
}

你以为这样就万事大吉了?并没有。确实这样实现,添加新的类型,只要新鞋一个类实现方法即可,很简单。但是如果要添加一个新的函数,那不好意思,所有的类都要进行修改。

简单总结下,就是说:

  • 过程式代码便于在不改动现由数据结构的前提下添加新的函数,面向对象便于在不改动现由函数的前提先添加新的类型
  • 过程式代码难以添加新的数据结构,因为必须修改所有函数。面向对象代码难以添加新函数,因为必须修改所有类
  • 对象暴露行为,隐藏数据。便于添加新的数据类型而无需修改现有行为,同时也难以在现有对象中添加新的行为
  • 数据结构(上面的第一种实现)暴露数据,没有明显的行为。便于向现有数据结构添加新行为,同时也难以向现有函数添加新的数据结构。

当然,具体使用哪一种还是应该灵活选择,不必拘泥。

如果希望灵活添加新行为,就使用数据结构的方式。如果希望灵活添加新类型,就使用面向对象的方式。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 烟草的香味 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档