观点
写注释是一种习惯,有些时候是一个程序员基本素养,甚至是职业道德体现。但是有些人就是不写,跟人、开发经验、性格等很多因素有关。和上班年限也有关,比如:
- 上班一年不写注释,我命个名都费劲,还写毛注释?
- 上班三年写注释,代码量有些积累,不写注释不是担心别人看不懂,而是担心自己看不懂
- 上班五年不写注释,我写的这么牛逼的代码,肯定不能写注释让别人看懂,这是我的核心技术
- 上班八年不写注释,公司离开我就会倒闭,我写的bug,只有我自己看得懂,我就是大湿
- 上班10年写注释,格局打开,日行一善
不写注释的原因有哪些
原因1:有一种代码本身写得很牛,行文风格流畅,让人一看就是大家风范,这种代码就不要注释。通俗讲你看他代码就知道代码作者的意图,举个例子,以下是ORB-SLAM2源码: 链接:orm-slam2代码块
MapPoint::MapPoint(const cv::Mat &Pos, Map* pMap, Frame* pFrame, const int &idxF): mnFirstKFid(-1), mnFirstFrame(pFrame->mnId), nObs(0), mnTrackReferenceForFrame(0), mnLastFrameSeen(0), mnBALocalForKF(0), mnFuseCandidateForKF(0),mnLoopPointForKF(0), mnCorrectedByKF(0), mnCorrectedReference(0), mnBAGlobalForKF(0), mpRefKF(static_cast<KeyFrame*>(NULL)), mnVisible(1), mnFound(1), mbBad(false), mpReplaced(NULL), mpMap(pMap) { Pos.copyTo(mWorldPos); cv::Mat Ow = pFrame->GetCameraCenter(); mNormalVector = mWorldPos - Ow; mNormalVector = mNormalVector/cv::norm(mNormalVector); cv::Mat PC = Pos - Ow; const float dist = cv::norm(PC); const int level = pFrame->mvKeysUn[idxF].octave; const float levelScaleFactor = pFrame->mvScaleFactors[level]; const int nLevels = pFrame->mnScaleLevels; mfMaxDistance = dist*levelScaleFactor; mfMinDistance = mfMaxDistance/pFrame->mvScaleFactors[nLevels-1]; pFrame->mDescriptors.row(idxF).copyTo(mDescriptor); // MapPoints can be created from Tracking and Local Mapping. This mutex avoid conflicts with id. unique_lock<mutex> lock(mpMap->mMutexPointCreation); mnId=nNextId++; }
原因2:有些代码不注释就是作者懒猪,呵呵,过了半个月,自己都看不懂自己写得bug了。过了一个月,看到自己的写得代码,一时半会没认出来,内心:这是哪个沙雕写的bug。哈哈哈哈
原因3:所谓教会徒弟,饿死师傅,只要我代码不写注释,公司永远就要需求我,出了bug只有我能解决,我永远立于不败之地。哈哈哈。
如何才能写出漂亮的注释
代码注释是有固定格式的,以上面那个构造函数为例子。可以参考下。
/** * @brief 该函数实现了地图点管理功能 * @in Pos 输入图像 * @out pMap 地图点 * @out pFrame 关键帧 * @in idxF 帧ID */ MapPoint::MapPoint(const cv::Mat &Pos, Map* pMap, Frame* pFrame, const int &idxF) { // 代码省略 }