喜悦国际村 
» 游客:  注册 | 登录 | 搜索 | 统计 | 喜悦证交所 | 帮助

RSS 订阅当前论坛  

$5.95 Web Hosting     

上一主题 下一主题
 35  1/4  1  2  3  4  > 
     
标题: 与uml面对对象php编程,零距离亲密接触~~  
 
开心果
论坛元老
Rank: 8Rank: 8
有种你就全部删光



UID 22257
精华 5
积分 3661
帖子 3560
金钱 3611 喜悦币
威望 50
人脉 0
阅读权限 90
注册 2003-8-5
状态 离线
[广告]: Enom域名自助付费 自助注册 自助PUSH 主流域名COM等一律57.99元年
与uml面对对象php编程,零距离亲密接触~~

轻轻松松用UML设计PHP程序

[B]作者:雨伞生日快乐(开心果原创)[/B][/COLOR]

[B]一、为什么要用UML?[/B][/COLOR]
[B]1、面对对象编程,稳定、易扩展、结构清晰。避免了功能模块方法所存在的相互间联系不紧密、接口单一、二次开发劳命伤财、垃圾代码过多等弊端。居家旅行常备工具。[/B]
[B]2、有利于团队开发,特别是开源项目,任何时候任何人,拿到相关技术文档,立即可以投入工作。[/B]
[B]3、将编程和编码分离(偶自己的定义^^),程序员设计技术文档,打字员负责编码,极大地提高工作效率。[/B]

[B]二、如何用UML设计面对对象的咚咚?[/B][/COLOR]
参见:
http://www.phpx.com/happy/showthread.php?s=&threadid=47326
要不然就自己买书吧。

[B]三、差不多是开工的时候了。[/B][/COLOR]
新闻更新系统为例,其实也不仅仅居然于此,反正就是管理一个种类kind和它下面的子件news的一个例子。偶刚学UML,水平有限,错误多多,有兴趣的看看吧。

[B]1、系统需求[/B][/COLOR]
我们根据用户的需求,搜集整理系统需求。系统需求包括三类—功能性需求、非功能性需求、可用性需求。

[B]功能性需求[/B],大家都很了解,也就是能够让用户获得什么样的功能,仔细了解用户的意向后,我们不能得出系统应该实现的主要功能。我们在本实例中的功能需求如下

管理员添加、删除、编辑“栏目内容”kind和“新闻内容”news

[B]非功能性需求[/B],如系统的稳定性、安全性等。虽然曾经有人号称电子商务是30%的后台php代码+70%的前台javascrit特效,但是偶反对代码中镶嵌JS等动态代码,html等静态代码基本上没什么太大的问题,前提是不影响易读性。镶嵌一堆JS代码的PHP所谓功能模块,偶将其直接和垃圾划等号,毕竟电子商务不是电子花瓶。这一部分的工作,就看自己的职业道德了。

[B]可用性需求[/B],用户毕竟是用户,用户要的是易用性,而不管你如何去实现。一套合理的思维体系,往往让用户使用起来得心应手,这年头,有几个人是先看书再使用Office系列的产品了。在B/S模式中,瘦客户端(浏览者)的动态实现,目前多为JAVASCRIPT,偶只想在这里说的是,这是一把双刃剑,过分的依赖不仅会割伤了用户,也会割伤了自己。

[B]2、需求分析[/B][/COLOR]
需求分析的主要任务就是识别系统的参与者和用例。

[B]识别参与者[/B]
本系统由几个参与者组成,本实例中仅用管理员(administrators)、浏览者(visitor)两个参与者。

[B]识别用例[/B]
说土一点,就是参与者所能执行的事件,如添加种类(addKind)、修改种类(updateKind)、删除种类(delKind)等。。。

[B]3、绘制出简单的用例图[/B][/COLOR]
如下,管理员(administrators)可以管理、浏览kind和news,浏览者(visitor)仅能浏览。




不删光,藐视你
2003-12-31 08:09 PM#1
查看资料  Blog  发短消息  顶部
 
开心果
论坛元老
Rank: 8Rank: 8
有种你就全部删光



UID 22257
精华 5
积分 3661
帖子 3560
金钱 3611 喜悦币
威望 50
人脉 0
阅读权限 90
注册 2003-8-5
状态 离线
[广告]: Enom域名自助付费 自助注册 自助PUSH 主流域名COM等一律57.99元年
[B]4、建立静态结构模型[/B][/COLOR]
[B]根据需求分析抽象出系统中的类[/B]
本例中我们设计kind类和news类这两个类,考虑到数据库的连接问题,我们设计了一个database类,进行基本的数据库操作,并且由database类派生出kind类和news类两个子类。这样,kind类和news类就继承了database父类的很多特性。

[B]绘制出系统的类图[/B]
也就是该类包含哪些方法、哪些属性,以及类之间的依赖等关系。如下图:




不删光,藐视你
2003-12-31 08:10 PM#2
查看资料  Blog  发短消息  顶部
 
开心果
论坛元老
Rank: 8Rank: 8
有种你就全部删光



UID 22257
精华 5
积分 3661
帖子 3560
金钱 3611 喜悦币
威望 50
人脉 0
阅读权限 90
注册 2003-8-5
状态 离线
[推荐阅读] 有广东佛山顺德的朋友吗~~
[B]5、根据类图设计系统的时序图[/B][/COLOR]
时序图也就是参与者操作的整个流程,比起过去的框框圈圈的流程图要直白得多,这里主要介绍一下删除种类(delKind)的流程,其他流程类似。

如下图,管理员(administrators)激活管理页面index.php的delKind()事件,该事件调用delKDialog.php中的createDialog(int,String)方法创建“删除种类窗口”。在管理员确认删除操作之前,让他明白自己准备删除的内容,是个不错的主意。所以,生成createDialog方法中,我们调用了kind类的returnNews()方法,将结果显示在所生成的确认删除窗口,告诉管理员它所即将删除的种类中有多少子件(新闻news)。管理员按下确认按钮,也可能是一个确认链接,激发delKDialog.php的delKind方法。后台根据传过来的种类的id,调用kind.class.php的kind(int)方法生成一个新的kind类,并同时调用该类的returnNews()方法查询该种类中现有的子件id的,并调用news.class.php的delNews()方法逐个删除。当然,如过你对自己的操作有足够的信心,并愿意承担由此引发的相关责任,你也可以一次性删除,具体根据个人习惯(大量删除时,一次性删除会快很多)。最后,调用我们kind.class.php的delKind()方法,实际的删除该种类kind。




不删光,藐视你
2003-12-31 08:11 PM#3
查看资料  Blog  发短消息  顶部
 
开心果
论坛元老
Rank: 8Rank: 8
有种你就全部删光



UID 22257
精华 5
积分 3661
帖子 3560
金钱 3611 喜悦币
威望 50
人脉 0
阅读权限 90
注册 2003-8-5
状态 离线
[推荐阅读] 查詢語句name like '%$keyword%'到底有没有错?
addKind



不删光,藐视你
2003-12-31 08:12 PM#4
查看资料  Blog  发短消息  顶部
 
开心果
论坛元老
Rank: 8Rank: 8
有种你就全部删光



UID 22257
精华 5
积分 3661
帖子 3560
金钱 3611 喜悦币
威望 50
人脉 0
阅读权限 90
注册 2003-8-5
状态 离线
[推荐阅读] 我还没有对上传文件到数据库操作过,问问大家这方面的问题
editKind



不删光,藐视你
2003-12-31 08:12 PM#5
查看资料  Blog  发短消息  顶部
 
开心果
论坛元老
Rank: 8Rank: 8
有种你就全部删光



UID 22257
精华 5
积分 3661
帖子 3560
金钱 3611 喜悦币
威望 50
人脉 0
阅读权限 90
注册 2003-8-5
状态 离线
[推荐阅读] 虽短但很搞笑!
addNews



不删光,藐视你
2003-12-31 08:13 PM#6
查看资料  Blog  发短消息  顶部
 
开心果
论坛元老
Rank: 8Rank: 8
有种你就全部删光



UID 22257
精华 5
积分 3661
帖子 3560
金钱 3611 喜悦币
威望 50
人脉 0
阅读权限 90
注册 2003-8-5
状态 离线
[推荐阅读] 急! 文字编码如何转换!!!!
editNews



不删光,藐视你
2003-12-31 08:14 PM#7
查看资料  Blog  发短消息  顶部
 
开心果
论坛元老
Rank: 8Rank: 8
有种你就全部删光



UID 22257
精华 5
积分 3661
帖子 3560
金钱 3611 喜悦币
威望 50
人脉 0
阅读权限 90
注册 2003-8-5
状态 离线
[推荐阅读] 急!!!!!用php连接ms Sql Server2000的问题
delNews



不删光,藐视你
2003-12-31 08:14 PM#8
查看资料  Blog  发短消息  顶部
 
开心果
论坛元老
Rank: 8Rank: 8
有种你就全部删光



UID 22257
精华 5
积分 3661
帖子 3560
金钱 3611 喜悦币
威望 50
人脉 0
阅读权限 90
注册 2003-8-5
状态 离线
[推荐阅读] falsh文件的瘦身?
[B]6、根据类图和时序图编码[/B][/COLOR]
觉得这应该是打字员做的事情,你会发现:依靠详细的技术文档编码,是一件非常宁人愉快的事情,不需要太多的思考。即使若干天后,你重新再接着干,你也能很快的进入脚色;即使很不幸,你身边一位很得力的同事离开了你的团队,第二天来的新人也能依靠技术文档,立即投入与你并肩作战。这也就是为什么印度阿三的文档总是那么细致,代码却总是那么低劣,但系统却总是那么完善的原因。事实上,在文章的最后,你同时会发现,偶的代码确实也挺烂的^^,至少我是这么认为。

[B]7、程序界面设计,包括页面[/B][/COLOR]
其实这部分,应该是在静态模型建立过程中,和类图一起生成的,但是由于种种原因,我放在了最后,不过请放心,你所需要做的仅仅是在页面得相应位置加入诸如showNews()等代码,模板同时也是一个不错的主意,更或者是将ADODB也引入database类的封装。我个人比较欣赏“模型、控制器、显示”的策略。

[B]8、调试[/B][/COLOR]
基本上没有什么好调试的,不用像以往那样,调试改错的时间比编码的时间还要长得多得多。放弃以往那种生存方式吧,那绝对是在慢性自杀。

从下一个PHP程序开始,面对对象,使用可爱的[B]UML[/B][/COLOR],你的生活将更加美丽。

[B]9、类库代码[/B][/COLOR]

database.class.php

<?php
    
class database {
        var 
$hostname "localhost";
        var 
$username "root";
        var 
$password "pass";
        var 
$basename "web";
        var 
$query    "";
        var 
$result   NULL;
        var 
$db       NULL;

   
/*
    //初始化
        function database() {
            $this->connect();
            $this->selectDatabase();
        }
        */

    //连接数据库
        
function connect() {
            
$this->db = @mysql_connect($this->hostname$this->username$this->password);
            if(
FALSE == $this->db) {
                echo 
"无法正常连接数据库。";
                exit;
            }
        }

    
//选择数据库
        
function selectDatabase() {
            if(
FALSE == mysql_select_db($this->basename)) {
                echo 
"无法正常打开选定的数据库。";
                return 
FALSE;
                exit;
            }
            return 
TRUE;
        }

    
//设置语句
        
function setQuery($myQuery) {
            if(
$myQuery == "") {
                echo 
"语句不能为空。";
                return 
FALSE;
            } else {
                  
$this->query $myQuery;
                  return 
TRUE;
              }

        }

    
//更新数据库
        
function store() {
            
$this->result mysql_query($this->query$this->db);
            
$this->query  "";

        }

    
//关闭数据库
        
function closeDatabase() {
            
mysql_close($this->db);
        }
    }

 
/*测试
    $test = new database;
    $test->setQuery("select * from class");
    $test->store();
    $row = mysql_fetch_array($test->result);
    echo "<pre>";
    print_r($row);
    echo "</pre>";
    $test->closeDatabase();
    */
?>
kind.class.ph

<?php
    
include_once("database.class.php");
    include_once(
"news.class.php");

    class 
kind extends database {
        var 
$idKind    NULL;
        var 
$nameKind  NULL;
        var 
$tableName "web_kind";

    
//初始化 没办法,只有PHP5才支持重载-_-#
        
function kind() {
            
$this->connect();
            
$this->selectDatabase();
            switch(
func_num_args()) {
                case 
1  :  $this->setKindId(func_get_arg(0));
                           
$this->setKindName($this->getKindName($this->idKind));
                        break;
                case 
2  :  $this->setKindId(func_get_arg(0));
                           
$this->setKindName(func_get_arg(1));
                        break;
                default :
                        exit;
            }
        }

    
//是否已存在,返回数目
        
function findKind() {
            
$this->setQuery("select count('kind_id') from $this->tableName");
            
$this->store();
            
$numKind mysql_fetch_array($this->result);
            return 
$numKind[0];
            
mysql_free_result($this->result);
        }

    
//添加种类
        
function insertKind() {
            
$this->setQuery("insert into $this->tableName set kind_name = '$this->nameKind' ");
            
$this->store();
            return 
$this->result;
        }

    
//修改种类
        
function updateKind() {
            
$this->setQuery("update $this->tableName set kind_name = '$this->nameKind' where kind_id = '$this->idKind'");
            
$this->store();
            return 
$this->result;
        }

    
//删除种类
        
function delKind() {
            
$this->setQuery("delete from $this->tableName where kind_id = '$this->idKind'");
            
$this->store();
            return 
$this->result;
        }

    
//显示种类列表,可以自行定义样式
        
function showKind() {
            
$this->setQuery("select * from $this->tableName order by kind_id");
            
$this->store();
            echo 
"<ul>";
            while(
$row mysql_fetch_array($this->result)) {
                echo 
'<li><a href="'.$row["kind_id"].'">'.$row["kind_name"].'</a></li>';
            }
            echo 
"</ul>";
            
mysql_free_result($this->result);
        }

    
//返回Kind类的id
        
function returnKindId() {
            return 
$this->idKind;
        }

    
//返回Kind类的name
        
function returnKindName() {
            return 
$this->nameKind;
        }
    
//设置Kind类的name,检查长度等操作
        
function setKindName($name) {
            if(
strlen($name) >= 12) {
        
//Call errorDialog
                
exit;
            } else {
                  
$this->nameKind $name;
                  return 
TRUE;
              }
        }

    
//设置Kind类的id,防止非正整数等
        
function setKindId($id) {
            if(
$id 0) {
        
//Call errorDialog
                
exit;
            } else {
                  
$this->idKind $id;
                  return 
TRUE;
              }
        }

    
//获得Kind类的name
        
function getKindName() {
            
$this->setQuery("select * from $this->tableName where kind_id = '$this->idKind'");
            
$this->store();
            
$KindName mysql_fetch_array($this->result);
            return 
$KindName["kind_name"];
        }

    
//获得该类的子件,555555~~,要是用PHP5该多好啊
        
function returnNews() {
            
$myNews = new news(0$this->idKind"NONE""NONE");
            return 
$myNews->returnNewsOfType();
        }
    }


  
/*测试
      */
    
$myKind = new kind(1);
    echo 
$myKind->showKind();
    
$test $myKind->returnNews();
    echo 
"<pre>";
    
print_r($test);
    echo 
"</pre>";
    
$myKind->closeDatabase();
      
/*
  */
?>
news.class.php

<?php
    
include_once("database.class.php");

    class 
news extends database {

        var 
$idNews    NULL;
        var 
$typeNews  NULL;
        var 
$titleNews NULL;
        var 
$textNews  NULL;
        var 
$tableName "web_news";

    
//初始化
        
function news() {
            
$this->connect();
            
$this->selectDatabase();
            switch(
func_num_args()) {
                case 
1  :  $this->setNewsId(func_get_arg(0));
                           
$this->getNewsInfomation();
                        break;
                case 
4  :  $this->setNewsId(func_get_arg(0));
                           
$this->setNewsType(func_get_arg(1));
                           
$this->setNewsTitle(func_get_arg(2));
                           
$this->setNewsText(func_get_arg(3));
                        break;
                default :
                        exit;
            }
        }

    
//插入News
        
function insertNews() {
            
$this->setQuery("insert into $this->tableName set
                                    news_type  = '$this->typeNews',
                                    news_title = '$this->titleNews',
                                    news_text  = '$this->textNews'"
);
            
$this->store();
            return 
$this->result;
        }

    
//修改News
        
function updateNews() {
            
$this->setQuery("update $this->tableName set
                                    news_type  = '$this->typeNews',
                                    news_title = '$this->titleNews',
                                    news_text  = '$this->textNews'
                             where news_id = '$this->idNews'"
);
            
$this->store();
            return 
$this->result;
        }

    
//删除News
        
function delNews() {
            
$this->setQuery("delete from $this->tableName where news_id = '$this->idNews'");
            
$this->store();
            return 
$this->result;
        }

    
//返回同一标题的内容数目
        
function returnNumTitle() {
            
$this->setQuery("select * from $this->tableName where news_title = '$this->titleNews'");
            
$this->store();
            return 
mysql_num_rows($this->result);
            
mysql_free_result($this->result);
        }

    
//返回同一种类的子件id
        
function returnNewsOfType() {
            
$this->setQuery("select news_id from $this->tableName where news_type = '$this->typeNews'");
            
$this->store();
            while(
$row mysql_fetch_array($this->result)) {
                
$NewsId[] = $row["news_id"];
            }
            return 
$NewsId;
        }

    
//设置News类id
        
function setNewsId($id) {
            if(
$id 0) {
                exit;
            } else {
                  
$this->idNews $id;
                  return 
TRUE;
              }
        }

    
//设置News类type
        
function setNewsType($type) {
            if(
$type 0) {
                exit;
            } else {
                  
$this->typeNews $type;
                  return 
TRUE;
              }
        }

    
//设置News类title
        
function setNewsTitle($title) {
            if(
$title == "") {
                exit;
            } else {
                  
$this->titleNews $title;
                  return 
TRUE;
              }
        }

    
//设置News类text
        
function setNewsText($text) {
            if(
$text == "") {
                exit;
            } else {
                  
$this->textNews $text;
                  return 
TRUE;
              }
        }

    
//设置News类type/title/text信息,偶比较懒^^
        
function getNewsInfomation() {
            
$this->setQuery("select * from $this->tableName where news_id = '$this->idNews'");
            
$this->store();
            
$NewsInformation mysql_fetch_array($this->result);
            
$this->setNewsType($NewsInformation["news_type"]);
            
$this->setNewsTitle($NewsInformation["news_title"]);
            
$this->setNewsText($NewsInformation["news_text"]);
            
mysql_free_result($this->result);
        }

    
//返回id
        
function returnId() {
            return 
$this->idNews;
        }

    
//返回type
        
function returnType() {
            return 
$this->typeNews;
        }

    
//返回title
        
function returnTitle() {
            return 
$this->titleNews;
        }

    
//返回text
        
function returnText() {
            return 
$this->textNews;
        }


    }

/*调试
    */
    
$myNews = new news(3);
    echo 
$myNews->returnNumTitle();
    
$test $myNews->returnNewsOfType();
    echo 
"<pre>";
    
print_r($test);
    echo 
"</pre>";
    
$myNews->closeDatabase();
    
/*
*/
?>
数据结构

CREATE TABLE web_kind (
  kind_id int(11) NOT NULL auto_increment,
  kind_name varchar(50) NOT NULL default '',
  PRIMARY KEY  (kind_id)
) TYPE=MyISAM;

CREATE TABLE web_news (
  news_id int(11) NOT NULL auto_increment,
  news_type int(11) NOT NULL default '0',
  news_title varchar(100) NOT NULL default '',
  news_text text NOT NULL,
  PRIMARY KEY  (news_id)
) TYPE=MyISAM;
[B]10、后记[/B][/COLOR]
本文主要依赖PHP4,进入PHP5后,本文就是垃圾;考虑到PHP5仍需时间,所以没有采用PHP5编码。

本文的主旨是表明设计思想,自己比较懒,也不想再检查什么,看见错误就不要Q偶啦。

之所以放到这个板块,是觉得项目组如果有一个资深系统分析员带队,事情会变得很简单。既然大大不愿/不屑出面,本极品菜鸟本着“JUST DO IT”的原则,献丑了。^^

[B]11、撰写本文的真正目的^^[/B][/COLOR]

亲爱的雨伞

好久没你消息了

这两天总想你

心里很乱

寻遍你爱去的池塘

就餐的小屋

睡觉的草坪

仍不见你踪影

我心都快碎了











养这么大的猪,咋就丢了呢

       猪,你生日快乐!^^

——开心果到此一游

    2003年11月11日




不删光,藐视你
2003-12-31 08:15 PM#9
查看资料  Blog  发短消息  顶部
 
roseangel (roseangel)
论坛元老
Rank: 8Rank: 8
资深会员



UID 22721
精华 0
积分 4735
帖子 4760
金钱 4735 喜悦币
威望 0
人脉 0
阅读权限 90
注册 2003-8-25
来自 天使城玫瑰窝
状态 离线
[推荐阅读] XXX.PHP?info=$info是什么意思?
11、撰写本文的真正目的^^

亲爱的雨伞

好久没你消息了

这两天总想你

心里很乱

寻遍你爱去的池塘

就餐的小屋

睡觉的草坪

仍不见你踪影

我心都快碎了


偶的乖乖~
看到后面偶的眼睛都看直了
先收藏再说
:D :D




生人勿近,否则叉之烧之~
2004-1-1 02:37 PM#10
查看资料  访问主页  发短消息  顶部
 35  1/4  1  2  3  4  > 
     


  可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题 | 开通个人空间  


 




Powered by Discuz! 6.1.0  © 2001-2010 Comsenz Inc.
Processed in 0.062112 second(s), 6 queries

(冀ICP备05009913号) 管理员:sadly 邮箱/MSN: sadly@phpx.com QQ:824008(长隐) 清除 Cookies - - Archiver - WAP