1.1.基本原则1)保持简单和直接原则KISS( keep it simple ,stupid)2)不要原则YAGNI(You aren' gonna need it.)确定真的必要时在写代码;以后也许我们会用到....错,你不会用到他3)避免复制原则DRY(Don't repeat yourself)4)信息隐藏原则  见实例15)高内聚松耦合  见实例2减少模块之间的耦合,采用散谭枪反模式;逻辑思想高度碎片化,并且分散在许多模块中,低内聚,严重相互依赖应将相同的代码提取出来放在一个高内聚的模块中一些其他原则单一职责SRP,会促进高内聚,高内聚往往时松耦合6)小心优化一般来说更改对性能的优化是微不足道的不局限于所谓的技巧,只要没有明确的性能要求就避免优化7)最少惊讶原则PLA8)童子军原则-发现不良及时修改重命名,将大函数变小来清理费解if-else;删除重复代码

2.C++代码整洁基本规范

2.1.良好的命名1)名称应该自注释;如上下文清晰用较短名称如类成员2)选择适当抽象层次的名称;使用域中的名称-专业术语3)避免冗余晦涩难懂名称,避免同名用于不同目的4)不用匈牙利命名法,不加入类型信息
2.2.注释不要为易懂代码写注释;不要通过注释禁用代码不要写块注释,不要用注释代替版本控制;特殊算法需要添加注释
2.3.数据:1)以适当方式访问存储实际内存中数据,数据分配应内存连续确保所有的数据结构都是cache行大小对齐2)不要将大量数据转换为全局变量;推迟定义本地变量仅在需要时再定义尽量避免数据转换期间可能发生数据拷贝,多次大小字节转换3)避免在计算时进行动态内存分配对于单线程在堆上分配内存也比在栈上分配内存开销大对于多线程需要等待分配器锁和释放内存4)避免不需要的数据初始化如果你需要初始化一大段的内存,考虑使用memset5)在STL容器中存储指针-动态分配对象class Base {};class A : public Base{};std::vector <Base *> v;v.push_back(new A);v.push_back(new Base);  delete v[0];delete v[1];std::vector <unique_ptr<Base>> v;v.push_back(make_unique<A>());v.push_back(make_unique<Base>()); 
2.4.语法:1)尽量少用跳转和分支;2)将循环内函数调用移动到循环外(for(i=0;i<100;i++) DoSomething();//改为DoSomething() { for(i=0;i<100;i++) { … }})3)优先使用迭代而不是递归;使用指令层的并行机制4)如果可以用>>,<<来代替整数乘除法5)小心使用模板调试STL库非常低效6)尽量使用begin,end通用函数,允许更灵活和通用风格void view(const int& value){cout<<value<<endl;}for_each(begin(arr),end(arr),view);//C风格的数字迭代器以封装好类似template<typename T,std::size_t size>T* begin(T(&element)([size]){return &element[0]}template<typename T,std::size_t size>T* end(T (&element)[size]){return &element[0]+size;}for(autoit=begin(arr);it!=end(arr);++it)cout<<*it<<endl;
2.5.函数
2.6.类:1)类实例应采用初始化而非赋值Color c(black); 比Color c; c = black;更快)2)使类构造函数尽可能轻量使用类初始化列表Color() : red(1), blue(2) {}而非初始化函数Color() {red=1;blue=2;} 3)类优先使用+= ,-= ,*= , /=;而非+ ,– , * ,/后者需创建匿名临时中间变量基本数据类型+ ,– , * ,/而非+= ,-= ,*= , /=;4)对象优先使用前缀操作符(不需拷贝)而非后缀操作符obj++(需一个临时拷贝)5)类继承必须有虚析构函数如类析构函数是非虚的,意味着它不会作为基类来使用(这种类就是“实体类”)当您删除这样一个对象时,C++将不会调用整个析构链;结果是不确定的。不应该公开继承实体类(STL容器,string,complex)class A{public:~A(){}};              // non virtualclass B: public A {public:~B(){}};   // 不好; A没有虚析构函数int main(){A * p = new B; delete p;} // 问题出现, B的析构未被调用6)将嵌套类声明为其包含类的友元嵌套类声明为外部类的友元类似应当放在后面而不是前面。若友元声明放置于嵌套类声明之前将丢弃友元声明,因为编译器还没有见过它class A {private:int i;public: class B{public:B(A & a) { a.i=0;};}; //先定义嵌套类friend class B;                      //友元声明};
    7)自定义类的输出流 见实例38)类成员指针:     见实例4成员指针:成员函数指针和数据成员指针只需要在星号之前加上类名::即可可以使用一个数据成员指针来监测和修改数据成员的值,而不必知道它的名字9)尽量在何时的场合使用单例使用单例可以减轻加载的负担,缩短加载时的时间,提高加载的效率并不是所有的地方都适用于单例,主要用于以下三个方面:(1) 控制资源的使用,通过线程同步来控制资源的并发访问;(2) 控制实例的产生,达到节约资源的目的;(3) 控制数据的共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信

3.资源管理

3.1.主要资源包括内存(堆或栈);磁盘网络文件;网络连接;线程锁定时器事务;其他操作系统资源如GDI句柄;易产生资源泄漏3.2.在栈上分配内存void foo(){ResType resource;resource.bar();}//资源都可安全释放
3.3.资源申请即初始化构造时获得析构时释放或基于范围的资源释放一般不需要重新造轮子也不需这中包装器,其实他就是智能指针//使用于不同资源的简单模板类class Resource {private:int x{ 0 };public:void foo() { cout << x << endl; }};template<typename Resource>class WrapperResource final {public:WrapperResource() { ptr_resource = new Resource(); }~WrapperResource() { delete ptr_resource; }Resource* operator->()const { return ptr_resource; }private:Resource* ptr_resource;};int main(){WrapperResource<Resource> a;a->foo();}

3.4.智能指针

1) 具有独占性智能指针unique_ptr<T>如超出ptrResource作用域,ptrResource释放其所持有的ResourceType类型实例最好将ptrResource放入容器中不会发生ResourceType实例深拷贝//实例1.1:使用#include<memory>class ResType{};std::unique_ptr<ResType> ptrResource{std::make_unique<ResouceType>()};auto ptrResource{std::make_unique<ResType>()};//使用类型推断方式更简单ptrResource->foo();//实例1.2:放入容器using ResTypePtr=std::unique_ptr<ResType>;using ResVecType=std::vector<ResTypePtr>;ResTypePtr resource{std::make_unique>ResType>()};ResVecType vec;vec.push_back(std::move(resource));//分别调用unique_ptr<T>的移动构造函数和移动赋值操作注意:运行到这里时候resource实例变成空//实例1.3:禁调用unique_ptr拷贝构造函数,用move将unique_ptr持有资源转移给另一个unique_ptrunique_ptr<ResType> pointer1=std::make_unique<ResType>();unique_ptr<ResType> pointer2;//此时是空的pointer2=std::move(pointer1);//此时pointer1是空的,pointer2是持有者
2)具有所有权的shared_ptr<T>说明:是可拷贝的也可用move<T>来移动他所指向的资源用途:    1)用途1删除内存中不在使用sharted_ptr.在使用缓存对象地方,weak_ptr的实例用于指向这些对象,但不拥有对象所有权,如weak_ptr<T>实例的expired()返回true那么垃圾回收该对象。2)可用weak_ptr<T>::lock()获取shared_ptr<T>实例,即使垃圾回收进程处于活动状态也可安全使用这个对象3)另外一个用途解决循环依赖问题//实例2.1:shared_ptr<T> p1=make_shared<T>();shared_ptr<T> p2;p2=move(p1);T * p=p2.get();//获取原始指针//实例2.2:如需要一没有所有权指针用weak_ptr<T>它对资源生命周期没有影响,仅观察它所指向资源并检查该资源是否有效void foo(cost weak_ptr<T>& weakResourse){if(!weakResourse.expired())//资源是有效的shared_ptr<T> sharedResourse=weakResourse.lock(); //获取一个shared_ptr<T>的实例}int main(){auto sharedResource(make_shared<T>());weak_ptr<T> weakResourse(sharedResource);foo(weakResource);sharedResource.reset();//删除sharedResource指向的T的实例foo(weakResource);     //仅在一小段时间内将弱指针提升为强指针就足够}

3.实例:

实例1://信息隐藏较差代码class AutomaticDoor{public:enum class State{closed=1,opening,open,closing};private:State state;public :State getState()const;};int main{}{AutomaticDoor door;AutomaticDoor::State doorsState=door.getState();if(doorsState==AutomaticDoor::State::closed){}}//良好代码class AutomaticDoor{public:bool isClosed()const;bool isOpening()const;bool isOpen()const;bool isClosing()const;private:enum class State{close=1,opening,open,closed};State state;};int main{}{AutomaticDoor door;if(door.isClosed()){}}
实例2://低内聚class Lamp{//灯和开关是紧耦合public:void on(){}void off(){}};class Switch{private:Lamp& lamp;bool state{false};public:Switch(Lamp& lamp):lamp(lamp){}void toggle(){if(state){state=false;lamp.off();}else{state=true;lamp.on();}};//高内聚低耦合-这个设计对扩展是开放的松耦合关键是接口,接口声明为公共行为而不涉及该类的具体实现//抽象接口:class Switchable{public:virtual void on()=0;virtual void off()=0;};//优点Switch已完全独立于由他控制的具体类,可进行独立性测试class Switch{private:Switchable& switchable;bool state{false};public:Switch(Switchable& switchable):switchable(switchable){}void toggle(){if(state){state=false;switchable.off();}else{state=true;switchable.on();}}};//Lamp类实现定义Switchable接口class Lamp:public Switchable{public:void on() override{}void off() override{}};
实例3://自定义类的输出流class Box{private:int x;public:friend std::ostream& operator<<(std::ostream& outstream,const Box& box);};std::ostream& operator<<(std::ostream& outstream,const Box& box){   outstream<<box.x<<"\n"<<endl;return outstream;}
实例4:类成员指针访问成员变量成员函数class A {public:int x=1; int y=2;int add() {return x+y;}};int main(){//成员变量指针:int A::* pv = &A::x;//定义类A成员变量指针A a;assert(a.x == a.*pv);a.*pv = 10; assert(a.x == 10);pv = &A::y;        //指向成员变量yassert(a.y == a.*pv);a.*pv = 20; assert(a.y = = 20);A* pA = new A;assert(pA->*pv == pA->y);assert(pA->*pv == 2);pA->*pv = 30; assert(pA->*pv == 30);//成员函数指针:int (A:: * pfunc) ();pfunc = &A::add;        //成员函数指针assert(a.x == 10 && a.y == 20);cout<<(a.*pfunc)()<<endl;         //30   assert(pA->x == 1 && pA->y == 30);cout << (pA->*pfunc)() << endl;//31delete pA; pA = nullptr;}

C++编程原则1 tcy相关推荐

  1. C++编程原则2 tcy

    8)函数编写原则 9)避免代码重复 10)复制后交换 11)不要在使用C语言的风格 12)删除-擦除技术 13)if...else优化技术参考本人博文 14)少用循环 1.函数编写原则 1.1.基本原 ...

  2. 每个程序员都必须遵守的编程原则

    好的编程原则跟好的系统设计原则和技术实施原则有着密切的联系.下面的这些编程原则在过去的这些年里让我成为了一名优秀的程序员,我相信,这些原则对任何一个开发人员来说,都能让他的编程能力大幅度的提高,能让他 ...

  3. 程序员应该遵守的编程原则

    为什么80%的码农都做不了架构师?>>>    好的编程原则跟好的系统设计原则和技术实施原则有着密切的联系.下面的这些编程原则在过去的这些年里让我成为了一名优秀的程序员,我相信,这些 ...

  4. [温故知新] 编程原则和模式

    写了这么多年代码,依旧做不好一个项目 做好一个项目是人力.产品.业务.技术.运营的结合,可能还叠加一点时机的因素,就我们码农而言,工作就是搬砖,实现产品, 给业务提供支撑. "给祖传代码加 ...

  5. 推荐给程序员们的十条编程原则

    对于新手程序员们来说,拥有良好的代码量积累和一定的熟练度可以顺利的上手工作:而想要进一步的提升自己的代码能力和工作效率,掌握必要的编程原则也是重要的环节. 前言 对于新手程序员们来说,拥有良好的代码量 ...

  6. 大牛架构师珍藏的10条编程原则

    程序员拥有一个较好的编程原则能使他的编程能力有大幅的提升,可以使其开发出维护性高.缺陷更少的代码.以下内容梳理自StactOverflow的一个问题:编程时你最先考虑的准则是什么? 目录 KISS(K ...

  7. 超级干货:你应该知道的那些编程原则!!

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | Mouse 来源 | http://r6d.c ...

  8. 程序员能力提升:你应该知道的那些编程原则!!

    本文翻译自Programming Principles(http://java-design-patterns.com/principles/). 每个程序员都可以从理解编程原理和模式中受益.这篇概述 ...

  9. 面向对象编程原则(06)——依赖倒转原则

    版权声明 本文原创作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl 参考资料 <大话设计模式> 作者:程杰 <Java设计模式> 作者:刘 ...

最新文章

  1. Python第三方包的egg info 是什么东西
  2. OSS- OSS brower 登陆失败
  3. WinForm窗体缩放动画
  4. swiper轮播图插件
  5. 为什么jsp写script代码报错_JSP 报错:ReferenceError: $ is not defined
  6. CF838C-Future Failure【dp,子集卷积】
  7. springboot启动时的一个bug
  8. es6 Class 的静态方法
  9. Docker监控:基于阿里云容器服务构建自己的Docker监控框架
  10. Hibernate XXX.hbm.xml 里的class标签的 schema 属性解释
  11. 设计模式之Builder模式
  12. 寻找 IT 服务行业隐形冠军, 航天信息上市十年再造中国梦
  13. 苹果手机无法连接wifi_苹果11pro连接wifi信号差
  14. 如何关闭CSDN右下角的小广告
  15. matlab分式函数求解,科学网—用MATLAB编写预估-校正法程序求分数阶常微分方程组数值解 - 王福昌的博文...
  16. Wifi热点java_Wifi热点实现文件传输
  17. c语言输出宽度右对齐,输出宽度设置
  18. vscode如何自定义背景图片
  19. 02前端学习之CSS3(1)
  20. SQL Server 2005中的Row_Number分页

热门文章

  1. Hotspot Metaspace
  2. 嵌入式Linux要学哪些?
  3. 用Postfix + Dovecot 搭建的邮件服务器被垃圾邮件当中转服务器的处理
  4. python annotate函数_Matplotlib库 标注点函数annotate()
  5. Django annotate
  6. 里奥老师乾坤大挪移—深入浅出EasyX用户输入与游戏动画1
  7. 在Linux命令行中使用计算器的5个命令
  8. 新型机器人闯入职场:到底是工作缔造者还是工作终结者?--华盛顿邮报
  9. 2021高考 无锡高中成绩查询,无锡2021高考成绩排名榜单,无锡各高中高考成绩喜报...
  10. 工控机linux安装win7,4网口工控机安装ProxmoxVE+LEDE+CentOS7