关于敏捷开发和小函数,我觉得纯属编程风格问题,很多流行观点我并不认同
最近才看到敏捷开发的一点观点,一般我对这种纯理论讨论不太关心,程序员的编程风格哪个更好,完全是一个自己个人的东西,这个很难定论的。
就像当年在学校的时候,所谓哪种学习方法更好。我一般看到诸如学习法的讨论都是一笑而过,每个学习成绩好的学生都不需要看这种东西,或者就是了解一下,每个人都会有自己的一套方法,而这个方法很难用语言表述给别人,别人即使按你的方法做了,也未必要那样的效果。
刚才看了一个观点,函数不要超过7行,超过7行就拆分为函数。问题是如果代码只存在于一处,从来不需要在别处运行,而且,这个代码只完成一种非常单一的功能,我认为就完全没有必要拆分。上一个我随便找到的函数:
bool Create(DWORD port,int bufsize) { if(mVT->m_lSize) return 0; //实例非空 if(bufsize<=0) return 0; //大小非法 bufsize += 4; CString name; name.Format(GUID_VIRTMEM_MX_SEND,port); name += L"_MUTEX"; //生成Recv端Mutex。 mVT->m_hMutex = ::CreateMutex(0,0,name); DWORD err = ::GetLastError(); if(err!=0){//如果已经生成(此端口发送端已经生成)或者生成失败,返回 0 。 CString msg; extlib::GetSystemMsg(err,msg); extlib::Print(L"CreateMutex failed: %s",(LPCWSTR)msg); CloseHandle(mVT->m_hMutex); mVT->m_hMutex = 0; return 0; } name.Format(GUID_VIRTMEM_MX_RECV,port); //生成接收端 Mutex 的名称 name += L"_MUTEX"; mVT->m_sMutex = name; name.Format(GUID_VIRTMEM_FS,port); //生成此端口使用的内存块 if(!mVT->m_VMemory.Alloc(bufsize,name)){ Close(); return 0; } mVT->m_lSize = bufsize; name.Format(GUID_VIRTMEM_MX_RECV,port); //此端口的接听同步 Event 名称 mVT->m_sEventRecv = name; name.Format(GUID_VIRTMEM_MX_SEND,port); //此端口的发送同步 Event 名称 mVT->m_sEventSend = name; name.Format(GUID_VIRTMEM_MX_RETU,port); //此端口的返回值同步 Event 名称 mVT->m_sEventReturn = name; mVT->m_hEventRecv = ::CreateEvent(0,0,0,mVT->m_sEventRecv); //初始状态阻塞 mVT->m_hEventSend = ::CreateEvent(0,0,1,mVT->m_sEventSend); //初始状态非阻塞 mVT->m_hEventReturn = ::CreateEvent(0,0,0,mVT->m_sEventReturn); //初始状态阻塞 if((mVT->m_hEventSend==0)||(mVT->m_hEventRecv==0)||(mVT->m_hEventReturn==0)){ Close(); return 0; } mVT->m_bExit = 0; return 1; }
[解决办法]
7 行,是太过分了点;不过要是几百行还不拆分的话,以后的维护通常会很困难
[解决办法]
俺相当讨厌敏捷开发,吹与装的过分,另外说小函数,有些业务是无法拆分的更小的,必须在一个函数内部反复。
[解决办法]
7行?简直是变态啊!
一个for循环就占3行,一个if else 就占6行。
要是汇编的话,我靠,那得多少个函数
[解决办法]
函数太小,就可能一个函数要传递很多个参数,否则就要使用全局变量,但好像不赞同使用很多全局变量,一是名字冲突,二是代码重用不便。
[解决办法]