| 添加到收藏夹 | 返回目录页 | 上一篇:类的另类用法--数据的封装 |
规范3
目录文档所有的目录下都需要具有README文档,其中包括:
该目录的功能及其包含内容
一个对每一文件的在线说明(带有link),每一个说明通常还应该提取文件标头的一些属性名字。
包括设置、使用说明
指导人民如何连接相关资源:
源文件索引
在线文档
纸文档
设计文档
其他对读者有帮助的东西
考虑一下,当每个原有的工程人员走了,在6个月之内来的一个新人,那个孤独受惊吓的探险者通过整个
工程的源代码目录树,阅读说明文件,源文件的标头说明等等做为地图,他应该有能力穿越整个工程。
--------------------------------------------------------------------------------
Use a Design Notation and Process
Programmers need to have a common language for talking about coding, designs, and the software process in general. This is critical to project success.
Any project brings together people of widely varying skills, knowledge, and experience. Even if everyone on a project is a genius you will still fail because people will endlessly talk past each other because there is no common language and processes binding the project together. All you@#ll get is massive fights, burnout, and little progress. If you send your group to training they may not come back seasoned experts but at least your group will all be on the same page; a team.
There are many popular methodologies out there. The point is to do some research, pick a method, train your people on it, and use it. Take a look at the top of this page for links to various methodologies.
You may find the CRC (class responsibility cards) approach to teasing out a design useful. Many others have. It is an informal approach encouraging team cooperation and focusing on objects doing things rather than objects having attributes. There@#s even a whole book on it: Using CRC Cards by Nancy M. Wilkinson.
--------------------------------------------------------------------------------
Using Use Cases
A use case is a generic description of an entire transaction involving several objects. A use case can also describe the behaviour of a set of objects, such as an organization. A use case model thus presents a collection of use cases and is typically used to specify the behavior of a whole application system together with one or more external actors that interact with the system.
An individual use case may have a name (although it is typically not a simple name). Its meaning is often written as an informal text description of the external actors and the sequences of events between objects that make up the transaction. Use cases can include other use cases as part of their behaviour.
Requirements Capture
Use cases attempt to capture the requirements for a system in an understandable form. The idea is by running through a set of use case we can verify that the system is doing what it should be doing.
Have as many use cases as needed to describe what a system needs to accomplish.
The Process
Start by understanding the system you are trying to build.
Create a set of use cases describing how the system is to be used by all its different audiences.
Create a class and object model for the system.
Run through all the use cases to make sure your model can handle all the cases. Update your model and create new use cases as necessary.
--------------------------------------------------------------------------------
Open/Closed Principle
The Open/Closed principle states a class must be open and closed where:
open means a class has the ability to be extended.
closed means a class is closed for modifications other than extension. The idea is once a class has been approved for use having gone through code reviews, unit tests, and other qualifying procedures, you don@#t want to change the class very much, just extend it.
The Open/Closed principle is a pitch for stability. A system is extended by adding new code not by changing already working code. Programmers often don@#t feel comfortable changing old code because it works! This principle just gives you an academic sounding justification for your fears :-)
In practice the Open/Closed principle simply means making good use of our old friends abstraction and polymorphism. Abstraction to factor out common processes and ideas. Inheritance to create an interface that must be adhered to by derived classes.
--------------------------------------------------------------------------------
Design by Contract
The idea of design by contract is strongly related to LSP . A contract is a formal statement of what to expect from another party. In this case the contract is between pieces of code. An object and/or method states that it does X and you are supposed to believe it. For example, when you ask an object for its volume that@#s what you should get. And because volume is a verifiable attribute of a thing you could run a series of checks to verify volume is correct, that is, it satisfies its contract.
The contract is enforced in languages like Eiffel by pre and post condition statements that are actually part of the language. In other languages a bit of faith is needed.
Design by contract when coupled with language based verification mechanisms is a very powerful idea. It makes programming more like assembling spec@#d parts.
--------------------------------------------------------------------------------
其他杂项
这一部分包含着各种各样的该做的和不该做的。
在需要用到离散的数值使,不要使用浮点数变量。采用浮点数来做循环计数器无异于向自己的脚
开枪。测试浮点数时总要使用 <= 或 => ,永远不要用 = 或 => 。
不要使用程序自动美化器,得益于好的程序样式的主要的人就是程序员自己,特别是刚开着手代
码、算法设计的程序员,使用程序自动美化器仅仅能根据语法来更正程序,因此当对空白和缩进
的注意有很大需要时,它是不可能做到的。正常的细心注意细节的程序员们能很好的用清晰直观
的样式来完成一个函数或文件(换句话来说,一些直观的样式是意向的规定而不是程序自动美化
器能读懂的智慧)。马虎的程序员应该学习细致的程序员,不要依赖程序自动美化器来增加程序
的可读性。最初的美化器是必须分析源代码的程序,复杂的美化器不值得通过这样获得好处,美
化器最好用于生成总的机器建立(machine-generated)格式代码。
对逻辑表达式第二个 = 不小心的忽略是一个问题,以下显得混乱而且更像是错误:
if ($abool= $bbool) { ... }
程序员在这里真的是要赋值么?一般常常是,但通常又不是这样。这样避免引起这样的混乱呢?解
决方案就是不要这样做,利用显式和隐式的判断测试,推荐的方法是在做测试前先做赋值:
$abool= $bbool;
if ($abool) { ... }
--------------------------------------------------------------------------------
使用if (0)来注释外部代码块
有时需要注释大段的测试代码,最简单的方法就是使用if (0)块:
function example()
{
great looking code
if (0) {
lots of code
}
more code
}
你不能使用/**/,因为注释内部不能包含注释,而大段的程序中可以包含注释,不是么?
--------------------------------------------------------------------------------
Different Accessor Styles
Why Accessors?
Access methods provide access to the physical or logical attributes of an object. We disallow direct access to attributes to break dependencies, the reason we do most things. Directly accessing an attribute exposes implementation details about the object.
To see why ask yourself:
What if the object decided to provide the attribute in a way other than physical containment?
What if it had to do a database lookup for the attribute?
What if a different object now contained the attribute?
If any of the above changed code would break. An object makes a contract with the user to provide access to a particular attribute; it should not promise how it gets those attributes. Accessing a physical attribute makes such a promise.
Implementing Accessors
There are three major idioms for creating accessors.
Get/Set
class X
{
function GetAge() { return $this->mAge; }
function SetAge($age) { $mAge= $age; }
var $mAge;
}
One Method Name
class X
{
function Age() { return $mAge; }
function Age($age) { $mAge= $age; }
var $mAge;
}
Similar to Get/Set but cleaner. Use this approach when not using the Attributes as Objects approach.
Attributes as Objects
class X
{
function Age() { return $mAge; }
function rAge() { return &$mAge; }
function Name() { return mName; }
function rName() { return &$mName; }
var $mAge;
var $mName;
}
X $x;
$x->rName()= "test";
The above two attribute examples shows the strength and weakness of the Attributes as Objects approach.
When using rAge(), which is not a real object, the variable is set directly because rAge() returns a reference. The object can do no checking of the value or do any representation reformatting. For many simple attributes, however, these are not horrible restrictions.
--------------------------------------------------------------------------------
Layering
Layering is the primary technique for reducing complexity in a system. A system should be divided into layers. Layers should communicate between adjacent layers using well defined interfaces. When a layer uses a non-adjacent layer then a layering violation has occurred.
A layering violation simply means we have dependency between layers that is not controlled by a well defined interface. When one of the layers changes code could break. We don@#t want code to break so we want layers to work only with other adjacent layers.
Sometimes we need to jump layers for performance reasons. This is fine, but we should know we are doing it and document appropriately.
--------------------------------------------------------------------------------
Code Reviews
If you can make a formal code review work then my hat is off to you. Code reviews can be very useful. Unfortunately they often degrade into nit picking sessions and endless arguments about silly things. They also tend to take a lot of people@#s time for a questionable payback.
My god he@#s questioning code reviews, he@#s not an engineer!
Not really, it@#s the form of code reviews and how they fit into normally late chaotic projects is what is being questioned.
First, code reviews are way too late to do much of anything useful. What needs reviewing are requirements and design. This is where you will get more bang for the buck.
Get all relevant people in a room. Lock them in. Go over the class design and requirements until the former is good and the latter is being met. Having all the relevant people in the room makes this process a deep fruitful one as questions can be immediately answered and issues immediately explored. Usually only a couple of such meetings are necessary.
If the above process is done well coding will take care of itself. If you find problems in the code review the best you can usually do is a rewrite after someone has sunk a ton of time and effort into making the code "work."
You will still want to do a code review, just do it offline. Have a couple people you trust read the code in question and simply make comments to the programmer. Then the programmer and reviewers can discuss issues and work them out. Email and quick pointed discussions work well. This approach meets the goals and doesn@#t take the time of 6 people to do it.
--------------------------------------------------------------------------------
Create a Source Code Control System Early and Not Often
A common build system and source code control system should be put in place as early as possible in a project@#s lifecycle, preferably before anyone starts coding. Source code control is the structural glue binding a project together. If programmers can@#t easily use each other@#s products then you@#ll never be able to make a good reproducible build and people will piss away a lot of time. It@#s also hell converting rogue build environments to a standard system. But it seems the right of passage for every project to build their own custom environment that never quite works right.
Some issues to keep in mind:
Shared source environments like CVS usually work best in largish projects.
If you use CVS use a reference tree approach. With this approach a master build tree is kept of various builds. Programmers checkout source against the build they are working on. They only checkout what they need because the make system uses the build for anything not found locally. Using the -I and -L flags makes this system easy to setup. Search locally for any files and libraries then search in the reference build. This approach saves on disk space and build time.
Get a lot of disk space. With disk space as cheap it is there is no reason not to keep plenty of builds around.
Make simple things simple. It should be dead simple and well documented on how to:
check out modules to build
how to change files
how to add new modules into the system
how to delete modules and files
how to check in changes
what are the available libraries and include files
how to get the build environment including all compilers and other tools
Make a web page or document or whatever. New programmers shouldn@#t have to go around begging for build secrets from the old timers.
On checkins log comments should be useful. These comments should be collected every night and sent to interested parties.
Sources
If you have the money many projects have found Clear Case a good system. Perfectly workable systems have been build on top of GNU make and CVS. CVS is a freeware build environment built on top of RCS. Its main difference from RCS is that is supports a shared file model to building software.
下一篇:规范2
↓相关文章:
- · 规范2
- · 使用PHP4.2.0及以后版本的注意事项:
- · PHP脚本数据库功能详解(2)
- · Session是否必须依赖Cookie
- · PHP 5昨天隆重推出--PHP 5/Zend Engine 2.0新特性
- · 对盗链说再见...
- · [FAQ]PHP中的一些常识:类篇
- · Oracle Faq(如何在ORACLE中更改表的列名和顺序 )
- · Oracle Faq(Oracle的字符集问题)
- · PHP 和 HTML
- · PHP安装问题
- · PHP 和 COM
- · 提问的智慧(2)
- · apache的几个设置(目录,权限等)
- · 用PHPdig打造属于你自己的Google
- · 利用PHP和AJAX创建RSS聚合器
- · PHP5的异常处理机制之使用throw关键字
- · AJAX在PHP中的简单使用
- · web开发中PHP+MySQL分页显示示例分析
- · 使用PHP编写基于Web的文件管理系统
- · Discuz论坛2.5 升级到PHP MySQL新版遇到的问题
- · 三招针对PHP木马攻击的易行防御之道
- · PHP程序漏洞产生的原因和防范方法
- · PHP取得当前插入数据库中记录的id值
- · php中关于处理字符串时效率的讨论
- · PHP+Access设计留言版实战
- · PHP实现的文件直接输出下载
- · PHP建立动态的WML站点
- · 简单站内HTML文件搜索程序
- · 自建Blog网站完全图解
- · phpMyAdmin2.6以上版本数据乱码问题
- · 关于PHP事件驱动问题之我见
- · PHP + BAT 制作PHP自解析批处理
- · [图片 显示] 缩图循环显示(php,mysql,script)
- · mysql 自动备份----aspbiz
- · PHP日常实用小Tips
- · Php应用实例--新增资料录到MySQL资料表
- · PHP-Push技术实现刷新功能 转载
- · 四种提示框代码
- · php 分析rss代码一段
- · 如何正确理解 PHP 的错误信息
- · 身份证方面的函数
- · Win XP下全新安装Apache2,PHP5,MYSQL5
- · linux下apache+mysql+php开发环境纯源代码编译搭建
- · RedhatAS3.0上安装Apache2+PHP5+MySQL+Resin+SSL+GD+weba

