美文网首页
面向对象编程:怎样才能写出一个“好”的类?

面向对象编程:怎样才能写出一个“好”的类?

作者: Drew_MyINTYRE | 来源:发表于2021-06-20 20:45 被阅读0次

面向对象编程的基本出发点是“对现实世界的模拟”,把问题中的实体抽象出来,封装为程序里的类和对象,这样就在计算机里为现实问题建立了一个“虚拟模型”。但它本质上是一种设计思想、方法,与语言细节无关,要点是抽象(Abstraction)和封装(Encapsulation)。

纯粹的面向对象也有一些缺陷,其中最明显的就是“继承”。

著名的鸟类的例子。基类 Bird 有个 Fly 方法,所有的鸟类都应该继承它。但企鹅、鸵鸟这样的鸟类却不会飞,实现它们就必须改写 Fly 方法。

各种编程语言为此都加上了一些“补丁”,像 C++ 就有“多态”“虚函数”“重载”,虽然解决了“继承”的问题,但也使代码复杂化了,一定程度上扭曲了“面向对象”的本意。

实现原则

  • 设计类的时候尽量少用继承和虚函数

  • 如果非要用继承不可,如果继承深度超过三层,就说明有点“过度设计”了,需要考虑用组合关系替代继承关系,或者改用模板和泛型。

  • 在设计类接口的时候,只负责单一的功能。

我还看到过很多人有一种不好的习惯,就是喜欢在类内部定义一些嵌套类,美其名曰“高内聚”。但恰恰相反,这些内部类反而与上级类形成了强耦合关系,也是另一种形式的“万能类”。正确的做法应该是,定义一个新的名字空间,把内部类都“提”到外面,降低原来类的耦合度和复杂度。

编码准则

// C++11 新增了一个特殊的标识符“final”(注意,它不是关键字)
class DemoClass final    // 禁止任何继承
{ ... };

在必须使用继承的场合,建议你只使用 public 继承,避免使用 virtual、protected,因为它们会让父类与子类的关系变得难以捉摸,带来很多麻烦。当到达继承体系底层时,也要及时使用“final”,终止继承关系。

class Interface        // 接口类定义,没有final,可以被继承
{ ... };           

class Implement final : // 实现类,final禁止再被继承
      public Interface    // 只用public继承
{ ... };

在现代 C++ 里,一个类总是会有六大基本函数:三个构造、两个赋值、一个析构。

对于比较重要的构造函数和析构函数,应该用“= default”的形式,明确地告诉编译器:“应该实现这个函数,但我不想自己写。”这样编译器就得到了明确的指示,可以做更好的优化。相似的,还有一种“= delete”的形式。它表示明确地禁用某个函数形式,而且不限于构造 / 析构,可以用于任何函数(成员函数、自由函数)。

class DemoClass final 
{
public:
    DemoClass() = default;  // 明确告诉编译器,使用默认实现
   ~DemoClass() = default;  // 明确告诉编译器,使用默认实现
};


class DemoClass final 
{
public:
    DemoClass(const DemoClass&) = delete;              // 禁止拷贝构造
    DemoClass& operator=(const DemoClass&) = delete;  // 禁止拷贝赋值
};

C++ 有隐式构造和隐式转型的规则,如果你的类里有单参数的构造函数,或者是转型操作符函数,为了防止意外的类型转换,保证安全,就要使用“explicit”将这些函数标记为“显式”。

class DemoClass final 
{
public:
    explicit DemoClass(const string_type& str)  // 显式单参构造函数
    { ... }

    explicit operator bool()                  // 显式转型为bool
    { ... }
};

常用技巧

  • 委托构造

class DemoDelegating final
{
private:
    int a;                              // 成员变量
public:
    DemoDelegating(int x) : a(x)        // 基本的构造函数
    {}  

    DemoDelegating() :                 // 无参数的构造函数
        DemoDelegating(0)               // 给出默认值,委托给第一个构造函数
    {}  

    DemoDelegating(const string& s) : // 字符串参数构造函数
        DemoDelegating(stoi(s))        // 转换成整数,再委托给第一个构造函数
    {}  
};
  • 成员变量初始化

class DemoInit final                  // 有很多成员变量的类
{
private:
    int                 a = 0;        // 整数成员,赋值初始化
    string              s = "hello";  // 字符串成员,赋值初始化
    vector<int>         v{1, 2, 3};   // 容器成员,使用花括号的初始化列表
public:
    DemoInit() = default;             // 默认构造函数
   ~DemoInit() = default;             // 默认析构函数
public:
    DemoInit(int x) : a(x) {}         // 可以单独初始化成员,其他用默认值
};

  • 类型别名

C++11 扩展了关键字 using 的用法,增加了 typedef 的能力,可以定义类型别名,易写易读。

using uint_t = unsigned int;        // using别名
typedef unsigned int uint_t;      // 等价的typedef


class DemoClass final
{
public:
    using this_type         = DemoClass;          // 给自己也起个别名
    using kafka_conf_type   = KafkaConfig;        // 外部类起别名

public:
    using string_type   = std::string;            // 字符串类型别名
    using uint32_type   = uint32_t;              // 整数类型别名

    using set_type      = std::set<int>;          // 集合类型别名
    using vector_type   = std::vector<std::string>;// 容器类型别名

private:
    string_type     m_name  = "tom";              // 使用类型别名声明变量
    uint32_type     m_age   = 23;                  // 使用类型别名声明变量
    set_type        m_books;                      // 使用类型别名声明变量

private:
    kafka_conf_type m_conf;                       // 使用类型别名声明变量
};

相关文章

  • PHP全栈学习笔记8

    面向对象的基本概念,面向对象编程,oop,面向对象,面向对象的分析,面向对象的设计,面向对象的编程,什么是类。 类...

  • PHP全栈学习笔记8

    面向对象的基本概念,面向对象编程,oop,面向对象,面向对象的分析,面向对象的设计,面向对象的编程,什么是类。 类...

  • python 面向对象编程

    面向对象编程 万物皆是对象,Python当然支持面向对象编程。类和对象是面向对象编程的两个主要方面,类创建一个新的...

  • 面向对象编程:怎样才能写出一个“好”的类?

    面向对象编程的基本出发点是“对现实世界的模拟”,把问题中的实体抽象出来,封装为程序里的类和对象,这样就在计算机里为...

  • 前端的那些事(五):类(封装,继承,多态)

    前言 js主要的三大编程方式:过程化编程,函数式编程,面向对象编程,好的面向对象编程,也可以理解为好的类的设计模式...

  • 面对对象高级编程

    面向对象高级编程: 面向对象编程:封装、继承和多态 面向对象高级编程:多重继承、定制类和元类

  • python所学--面向对象(oop)--初级魔法方法

    1.面向对象编程的介绍 面向对象就是让对象取帮你做你想做的事情,面向对象编程分为类和对象,类就是一个模块,而对象就...

  • 面向对象_初识

    目录 面向对象编程介绍 类与对象介绍 私有属性与私有方法 面向对象编程 1. 面向对象编程介绍 面向对象编程:Ob...

  • 类和对象2018-10-17

    类和对象 一般编程思想1.面向过程编程-->算法,逻辑2.函数式编程-->函数3.面向对象编程-->类和对象 类的...

  • 2018-10-17类,对象

    1、面向过程编程 --> C,算法、逻辑 2、函数式编程 --> 函数 3、面向对象编程 --> 类和对象 一、类...

网友评论

      本文标题:面向对象编程:怎样才能写出一个“好”的类?

      本文链接:https://www.haomeiwen.com/subject/cmnjyltx.html