良好的编程良好的行为习惯有哪些些

漫谈 C++:良好的编程习惯与编程要点
开发者头条
⑤如果可以,参数尽量使用reference to constclass complex { public: complex& operator += (const complex &) }使用引用避免类对象构造与析构的开销,使用const确保参数不会被改变。内置类型的值传递与引用传递效率没有多大差别,甚至值传递效率会更高。例如,传递char类型时,值传递只需传递一个字节;引用实际上是指针实现,需要四个字节(32位机)的传递开销。但是为了一致,不妨统一使用引用。⑥ 如果可以,函数返回值也尽量使用引用以引用方式返回函数局部变量会引发程序未定义行为,离开函数作用域局部变量被销毁,引用该变量没有意义。但是我要说的是,如果可以,函数应该返回引用。当然,要放回的变量要有一定限制:该变量的在进入函数前,已经被分配了内存。以此条件来考量,很容易决定是否要放回引用。而在函数被调用时才创建出来的对象,一定不能返回引用。说回operator +=,其返回值就是引用,原因在于,执行a+=b时,a已经在内存上存在了。
来源:新浪科技
来源:澎湃新闻
来源:腾讯太空
来源:经济参考报
来源:凤凰科技
来源:数码驿站
来源:新浪科技
来源:第一财经日报
来源:新浪科技
来源:人人都是产品经理
来源:科技讯
来源:花儿街参考
来源:BUY家
来源:腾讯科学
来源:腾讯数码
来源:股海畅游
来源:第一财经网
来源:科技日报
来源:环球网
来源:股市交易资讯
Ctrl+D&将本页面保存为书签,全面了解最新资讯,方便快捷。Web前端开发有哪些良好的编程习惯?
比如像script尽量要放在&/body&之前,保持良好的缩进类似这样的习惯
按投票排序
推荐你看看腾讯AlloyTeam总结的一些工程师代码书写习惯更新
建议多看书。另外,不妨优先参考
大神汇总的 ()中的:- 代码质量(Coding style、单元测试、自动化测试)提高代码质量。- 前端标准/规范,了解相对正确和新鲜的内容。- 编程知识储备,、- 部署流程、代码组织...ps:多看常更新的专业团队博客和喜欢share技巧的达人也是不错的获取技巧的方法。 如:
Javascript style guide by airbnb:(推荐 更新了很多ES6的内容 例子很详细)HTML&CSS guide:mdo: Bootstrap作者之一Primer github使用的html css规范
别在js里拼HTML,模板引擎必须默认HTML转义
推荐一下ES6(ECMAScript 2015) 编码规范与详细注意要点,结合广发证券大量ES6实践项目整理而成,已开源于Github中,持续更新中,欢迎PR以及提issue。从今天开始用上未来的技术吧。
Baidu EFE Frontend Guide:
在一定团队范围内建立一套编码规范,然后通过codereview 和 机制来通过编辑器和人为强化的方式维持和推广。
KISS 可理解为不要作死:不要写难以理解的代码不要在代码中炫技不要为了设计而设计能简单就绝不复杂这些做到就足够了,其他XX规范只不过给你的团队提供了一个统一的格式而已。
通过分析github代码库总结出来的工程师代码书写习惯
真的太多了。晚上详细码一码,code review很重要,看别人代码更重要。编程技术就是不断的模仿和吸收。晚上拿段代码举例来说明吧。
已有帐号?
无法登录?
社交帐号登录您现在的位置:&&&>&&>&&>& >> 正文
程序员:编程需要良好的习惯来源:
时间; 22:19:55
导读:编写程序是一项系统而繁琐的工作,它不仅需要程序设计人员具有一定的功底,更需要有良好的编程习惯和风格。良好的编程习惯和风格不仅可以使程序代码更易于读懂和修改,更重要的是,它可以使程序的结构更加合理,有助于提高程序的执行效率。下面是我在程序设计中总结的一些经验,供大家参考。
&&&& 编写程序是一项系统而繁琐的工作,它不仅需要程序设计人员具有一定的功底,更需要有良好的编程习惯和风格。良好的编程习惯和风格不仅可以使程序代码更易于读懂和修改,更重要的是,它可以使程序的结构更加合理,有助于提高程序的执行效率。下面是我在程序设计中总结的一些经验,供大家参考。
&&& 设计顺序
&&& 在我们刚开始学习程序设计的时候,要编写一个程序,总是先进行一番构思,然后就一边写代码一边调试。这种方法一般只适用于非常小的程序,根据软件工程的特点,如果对所有程序都还按这种方法进行设计,是不合理的。
&&& 其实,设计程序就像我们盖高楼大厦,首先要设计图纸,然后动工。所以,对于个人编写程序来说,应遵循以下步骤:
&&& 1、问题分析:对我们要使用程序设计手段去解决的问题进行系统地分析,了解程序是做什么的,要达到一种什么样的效果等。
&&& 2、结构设计:也就是对程序的整体框架进行设计,设计出我们需要使用的模块等等,并画出流程图。
&&& 3、用户界面设计:在此,我们要设计出用于与用户交互的输入输出界面。
&&& 4、代码设计:在这个步骤中,我们要进行代码的编写。
&&& 5、调试:对程序中正在发生或可能发生的各种错误进行处理。
&&& 6、维护:通俗地说,维护就是对程序进行升级,对原有错误进行修改。
对于以上几个步骤,我想大多数人会认为代码设计最为重要,但如果程序的结构尚未清楚,我们在编写代码的时候就会发生混乱,一个程序性能的好坏,主要还是取决于它的结构是否合理。因此,在程序设计中,我们要尽可能注意这一点,这样才能使我们的程序更加完善。
&&& 设计环境
一个良好的编程环境可以使我们在编写程序时,不至于造成各种资源的紊乱,还可以避免资源的丢失。建议大家要在放源程序的目录下建立&Programs&文件夹;然后再以你要编写的程序名和版本为名建立一个文件夹,用于存放整个源程序以及各种资源;最后,分别建立几个文件夹,&Documents&:用于存放程序文档,包括流程图等;&Resource&:用于存放图片,声音,影片等资源;&Debug&:用于存放调试的程序。&Release&:用于存放最终释放的程序。
&&& 例如:我们要制作一个英语学习软件,名为&English&,版本为1.0,那么我们的编程环境中应存在以下文件夹:
&&& [DRIVE]:\&\Programs\English1\Debug\
&&& [DRIVE]:\&\Programs\English1\Documents\
&&& [DRIVE]:\&\Programs\English1\Resource\
&&& [DRIVE]:\&\Programs\English1\Release\
另外,最好再建立一个专门的文件夹,用于存放各种模块,以便能实现代码的重用,这样,我们就不用在每次写程序时,都重写所有的模块,编程速度会有很大的提高。
网友评论仅供其表达个人看法,并不表明尚大教育同意其观点或证实其描述
赞助商广告
赞助商广告
软考培训,尚大教育,太原软考培训,上海软考培训,南京软考培训,广州软考培训,昆明软考培训,杭州软考培训,武汉软考培训,济南软考培训,北京软考培训
全国统一客服热线:400-&┊& 010- &&&&&尚大教育-致力打造中国教育培训第一品牌& & & & & & & & Copyright &
尚大教育集团
京ICP备号-1 &nbsp 京公网安备72号 &nbsp编程人员的七个良好习惯
在企业级的应用开发中,我们更强调程序员的协作能力和团队开发,如何能融入团队,成为一个优秀的程序员,本文总结了从事开发工作中七个好习惯。所谓&思想影响行为,行为决定习惯,习惯养成性格,性格左右命运&。本文介绍的内容需要有意识地(思想上要先认同)培养才能具备,需要随时提醒自己按照这七个好习惯去行动才能得以实现。
&&&& 习惯一:注意休息,适当放松&&&& 编程工作的强度是很大的,程序员要长时间全神贯注在手上的工作,很容易出现精神紧张和疲劳现象。因此,一定要注意休息,让紧绷的神经有个放松的机会,然后再以饱满的精神投入到下一轮编程工作中。在休息期间,最好能忘却手上的工作;当重新坐回到计算机前时,最好也能用一种全新的面貌重新开始。至少应该每隔一个小时就站起身做做伸展运动并眺望一下窗外的景物!&&&& 习惯二:谦虚谨慎,戒骄戒躁&&&& 过度自我会导致两大类问题,它们都会影响你与搭档之间的合作。第一类,认为&老子天下第一&,不考虑搭档的建议;第二类,防御心理过重,不能虚心接受搭档的批评,把善意的劝告视为不信任。记住,作为一名程序员,必须把团队和项目进度摆在自我之上,一切成功或失败都属于团队!&&&& 高超的技术并不代表你什么都知道、什么都做得好,更不代表别人都不如你,即便你是一个项目经理、技术总监,都要知道自己应该怎样去与其他人合作保证程序设计工作取得成功。每个程序员都应该做好随时交换老师和学生角色的心理准备,把握每一个可以学习或传授知识的机会。&&&&习惯三:既要自信,又要虚心&&&& 把每一次的编程工作当作一个锻炼自己提高的好机会,在不断地观察和获得反馈意见的过程中学习进步。当你亲身体会到&没有人是无所不知的&和&很多人知道的事情并不像你想象的那么多&的时候,你的自信心就会在不知不觉中提高起来。&&&& 害怕表现的愚蠢往往会让人不敢提出建议或尽可能少地提出建议,这是程序员的通病。在一个团队中,我们不应该存在竞争心理,必须为同一个目标而努力,搭档间不应该彼此指责或把错误归咎于对方,信任彼此的判断力和彼此对团队的忠诚,是一个成功团队的前提。&&&& 习惯四:交流&&&& 搭档之&|&&&&(第1/3页)浏览9次&|&&猜你喜欢:热门分享:以良好的方式编写C++ class
假设现在我们要实现一个复数类complex,在类的实现过程中探索良好的编程习惯。
① Header(头文件)中的防卫式声明
complex.h:
__COMPLEX__
# define __COMPLEX__
class complex
防止头文件的内容被多次包含。
② 把数据放在private声明下,提供接口访问数据
__COMPLEX__
# define __COMPLEX__
class complex
double real() const {}
double imag() const {}
doubel re,
③ 不会改变类属性(数据成员)的成员函数,全部加上const声明
例如上面的成员函数:
double real () `const` {}
double imag() `const` {}
既然函数不会改变对象,那么就如实说明,编译器能帮你确保函数的const属性,阅读代码的人也明确你的意图。
而且,const对象才可以调用这些函数——const对象不能够调用非const成员函数。
④ 使用构造函数初始值列表
class complex
complex(double r = 0, double i =0)
: re(r), im(i)
doubel re,
在初始值列表中,才是初始化。在构造函数体内的,叫做赋值。
⑤如果可以,参数尽量使用reference to const
为complex 类添加一个+=操作符:
class complex
complex& operator += (const complex &)
使用引用避免类对象构造与析构的开销,使用const确保参数不会被改变。内置类型的值传递与引用传递效率没有多大差别,甚至值传递效率会更高。例如,传递char类型时,值传递只需传递一个字节;引用实际上是指针实现,需要四个字节(32位机)的传递开销。但是为了一致,不妨统一使用引用。
⑥ 如果可以,函数返回值也尽量使用引用
以引用方式返回函数局部变量会引发程序未定义行为,离开函数作用域局部变量被销毁,引用该变量没有意义。但是我要说的是,如果可以,函数应该返回引用。当然,要返回的变量要有一定限制:该变量的在进入函数前,已经被分配了内存。以此条件来考量,很容易决定是否要返回引用。而在函数被调用时才创建出来的对象,一定不能返回引用。
说回operator +=,其返回值就是引用,原因在于,执行a+=b时,a已经在内存上存在了。
而operator + ,其返回值不能是引用,因为a+b的值,在调用operator +的时候才产生。
下面是operator+= 与'operator +' 的实现:
inline complex & complex :: operator += (const complex & r)
this -& re+= r-&
this -& im+= r-&
inline complex operator + (const complex & x , const complex & y)
return complex ( real (x)+ real (y),
//新创建的对象,不能返回引用
imag(x)+ imag(y));
在operator +=中返回引用还是必要的,这样可以使用连续的操作:
c3 += c2 += c1;
⑦ 如果重载了操作符,就考虑是否需要多个重载
就我们的复数类来说,+可以有多种使用方式:
complex c1(2,1);
complex c2;
c2 = c1+ c2;
c2 = c1 + 5;
c2 = 7 + c1;
为了应付怎么多种加法,+需要有如下三种重载:
inline complex operator+ (const complex & x ,const complex & y)
return complex (real(x)+real(y),
imag(x+imag(y););
inline complex operator + (const complex & x, double y)
return complex (real(x)+y,imag(x));
inline complex operator + (double x,const complex &y)
return complex (x+real(y),imag(y));
⑧ 提供给外界使用的接口,放在类声明的最前面
这是某次面试中,面试官大哥告诉我的。想想确实是有道理,类的用户用起来也舒服,一眼就能看见接口。
Class with pointer member(s):记得写Big Three
C++的类可以分为带指针数据成员与不带指针数据成员两类,complex就属于不带指针成员的类。而这里要说的字符串类String,一般的实现会带有一个char *指针。带指针数据成员的类,需要自己实现class三大件:拷贝构造函数、拷贝赋值函数、析构函数。
class String
String (const char * cstr = 0);
String (const String & str);
String & operator = (const String & str);
~String();
char * get_c_str() const {return m_data};
如果没有写拷贝构造函数、赋值构造函数、析构函数,编译器默认会给我们写一套。然而带指针的类不能依赖编译器的默认实现——这涉及到资源的释放、深拷贝与浅拷贝的问题。在实现String类的过程中我们来阐述这些问题。
①析构函数释放动态分配的内存资源
如果class里有指针,多半是需要进行内存动态分配(例如String),析构函数必须负责在对象生命结束时释放掉动态申请来的内存,否则就造成了内存泄露。局部对象在离开函数作用域时,对象析构函数被自动调用,而使用new动态分配的对象,也需要显式的使用delete来删除对象。而delete实际上会调用对象的析构函数,我们必须在析构函数中完成释放指针m_data所申请的内存。下面是一个构造函数,体现了m_data的动态内存申请:
/*String的构造函数*/
String ::String (const char *cstr = 0)
m_data = new char[strlen(cstr)+1];
// 这里,m_data申请了内存
strcpy(m_data,cstr);
m_data= new char[1];
*m_data = '\0';
这个构造函数以C风格字符串为参数,当执行
String *p = new String (&hello&);
m_data向系统申请了一块内存存放字符串hello:
析构函数必须负责把这段动态申请来的内存释放掉:
String ::~String()
delete[]m_
②赋值构造函数与复制构造函数负责进行深拷贝
来看看如果使用编译器为String默认生成的拷贝构造函数与赋值操作符会发生什么事情。默认的复制构造函数或赋值操作符所做的事情是对类的内存进行按位的拷贝,也称为浅拷贝,它们只是把对象内存上的每一个bit复制到另一个对象上去,在String中就只是复制了指针,而不复制指针所指内容。现在有两个String对象:
String a(&Hello&);
String b(&World&);
a、b在内存上如图所示:
如果此时执行
浅拷贝体现为:
存储World\0的内存块没有指针所指向,已经成了一块无法利用内存,从而发生了内存泄露。不止如此,如果此时对象a被删除,使用我们上面所写的析构函数,存储Hello\0的内存块就被释放调用,此时b.m_data成了一个野指针。来看看我们自己实现的构造函数是如何解决这个问题的,它复制的是指针所指的内存内容,这称为深拷贝
/*拷贝赋值函数*/
inline String &String ::operator= (const String & str)
if(this == &str)
delete[] m_
m_data = new char[strlen(str.m_data)+1];
strcpy(m_data,str.m_data);
return *this
这是拷贝赋值函数的经典实现,要点在于:
① 处理自我赋值,如果不存在自我赋值问题,继续下列步骤:
② 释放自身已经申请的内存
③ 申请一块大小与目标字符串一样大的内存
④ 进行字符串的拷贝
对于a = b,②③④过程如下:
同样的,复制构造函数也是一个深拷贝的过程:
inline String ::String(const String & str )
m_data = new char[ strlen (str) +1];
strcpy(m_data,str.m_data);
另外,一定要在operator = 中检查是否self assignment 假设这时候确实执行了对象的自我赋值,左右pointers指向同一个内存块,前面的步骤②delete掉该内存块造成下面的结果。当企图对rhs的内存进行访问是,结果是未定义的。
static与类
① 不和对象直接相关的数据,声明为static
想象有一个银行账户的类,每个人都可以开银行账户。存在银行利率这个成员变量,它不应该属于对象,而应该属于银行这个类,由所有的用户来共享。static修饰成员变量时,该成员变量放在程序的全局区中,整个程序运行过程中只有该成员变量的一份副本。而普通的成员变量存在每个对象的内存中,若把银行利率放在每个对象中,是浪费了内存。
② static成员函数没有this指针
static成员函数与普通函数一样,都是只有一份函数的副本,存储在进程的代码段上。不一样的是,static成员函数没有this指针,所以它不能够调用普通的成员变量,只能调用static成员变量。普通成员函数的调用需要通过对象来调用,编译器会把对象取地址,作为this指针的实参传递给成员函数:
obj.func() ---& Class :: fun(&obj);
而static成员函数即可以通过对象来调用,也可以通过类名称来调用。
③在类的外部定义static成员变量
另一个问题是static成员变量的定义。static成员变量必须在类外部进行定义:
int A::a = 10;
注意①是声明,②才是定义,定义为变量分配了内存。
④static与类的一些小应用
这些可以用来应付一下面试,在实现单例模式的时候,static成员函数与static成员变量得到了使用,下面是一种称为”饿汉式“的单例模式的实现:
static A& getInstance();
setup(){...};
A(const A & rhs);
这里把class A的构造函数都设置为私有,不允许用户代码创建对象。要获取对象实例需要通过接口getInstance。”饿汉式“缺点在于无论有没有代码需要a,a都被创建出来。下面是改进的单例模式,称为”懒汉式“:
A& getInstance();
setup(){....};
A(const A& rsh);
A& A::getInstance()
&懒汉式&只有在真正需要a时,调用getInstance才创建出唯一实例。这可以看成一个具有拖延症的单例模式,不到最后关头不干活。很多设计都体现了这种拖延的思想,比如string的写时复制,真正需要的时候才分配内存给string对象管理的字符串。
阅读(...) 评论()

我要回帖

更多关于 良好的卫生习惯有哪些 的文章

 

随机推荐