日升家园

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 657|回复: 2

中国象棋软件引擎审局揭秘系列5

[复制链接]

864

主题

1936

帖子

2191

积分

理事长

Rank: 9Rank: 9Rank: 9

UID
39
精华
0
威望
3
贡献值
24
金币
21325
在线时间
1237 小时
注册时间
2013-8-28
最后登录
2021-7-19

优秀版主论坛元老

QQ
发表于 2013-10-25 14:14:35 | 显示全部楼层 |阅读模式
关于php的一些技术要点
      分类:默认栏目1. 内存管理, 由解析引擎负责, 使用ref计数方法, 一个新的类, 创建以后, 不再使用时, 要unset()
2. 数据库连接, 视数据库支持而定, mysql支持持久和非持久两种, 万人站点可以使用connect()方式,
      pconnect()可以使用phplib的类, 当然, pconnect()时, 需要注意不要在处理数据库请求时同时做其他操作
      3. 如果是一个多次引用的类, 在inc里面创建, 并且使用require_once包含 -- DISCUZ!的做法, include是重复解析,
      include_once是一次解析的, 所以, 对多次引用的类, 应该使用include_once/require_once的方法
      4. 可以去www.php.net直接查阅手册, PEAR.php.net 可以找到常用需要的类库
      
      上述内容涉及
      1. 语法
      2. 内存管理
      3. 数据库(对象)使用方法
      4. 常用类库和站点
      
      基本上, 每种语言都需要注意上述的内容
      2006.11.23 08:20 作者:fenon 收藏 | 评论:0
      今天看了一下asp.net的资料
      分类:默认栏目asp.net内嵌支持MVC, 真是非常神奇
      
      微软不愧为巨头级别的软件开发商
      
      下面是参考资料
      
      在ASP.NET中实现Model-View-Controller模式(二)
      
      MVC模式形容这种实现方式是一种被动的实现机制,ASP.NET充当了程序执行中的控制器的角色,但程序员必须将具体的事件处理方法添加到事件的响应函数中。如在这个例子中,控制器在页面加载之前调用Page_Load函数并执行其中的代码,当用户点击Submit按钮时由系统调用SubmitBtn_Click函数并执行。
      
      这种将代码都包含在一个文件中的实现方式非常的直接,而且当应用程序很小并不经常修改的时候也可以说是一种好的方法,但是如果下面的一些情况出现的话你也许会开始考虑修改这种实现方法:
      
      使编程的工作并行并减少由此带来的发生错误的可能性。为了增加工作的并行性,提高效率,你可能想让不同的人编写视图的代码及模型代码并尽力减少这种工作方式所带来的出错的可能性。例如:当所有的代码都在一个文件中的话,那么一个编程人员可能会在改变DataGrid显示格式的时候无意中修改数据访问的代码。这种错误是很难被发现的,直到页面整体被编译的时候才会显现出来。。
      
      使你的数据访问代码在其它页面中重用。在这种单文件的实现方式中,除了拷贝代码,没有其它的方法能够做到代码的重用。拷贝的代码是很难被维护的,因为一旦代码发生了变化,你必须在所有的页面都进行修改。
      
      为了避免上面这些情况的发生,ASP.NET引入了代码分离(Code-behind)机制。
      
      用代码分离机制进行重构
      Microsoft Visual Studio
      .NET中的代码分离机制使视图层的代码与模型及控制器的代码能够很容易的分离。每个ASP.NET页面都有一种机制,能够使其要调用的方法在一个与其分离的类中实现。这种方式使用起来非常的方便,而且也可以利用Visual
      Studio .NET中的一些其它特性共同完成开发工作。比如如当你利用代码分离的机制开发你的页面的时候,可以利用智能感知(IntelliSense
      technology)显示出一个可用方法的列表方便编程。而智能感知技术在.aspx页面中是不能使用的。
      
      下面给出的是上面例子利用代码分离机制的实现。
      
      视图部分:
      
      视图层的代码现在一个单独的文件中实现。Solution.aspx:
      
&#160; &#160;&#160; &#160;<%@ Page language="c#" Codebehind="Solution.aspx.cs"
&#160; &#160;&#160; &#160;&#160; &#160;AutoEventWireup="false" Inherits="Solution" %>
&#160; &#160;&#160; &#160;<html>
&#160; &#160;&#160; &#160;&#160; &#160;<head>
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;<title>Solution</title>
&#160; &#160;&#160; &#160;&#160; &#160;</head>
&#160; &#160;&#160; &#160;&#160; &#160;<body>
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;<form id="Solution" method="post" runat="server">
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;<h3>Recordings</h3>
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;Select a Recording:<br/>
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;<asp:dropdownlist id="recordingSelect" runat="server" />
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;<asp:button id="submit" runat="server" text="Submit"
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;enableviewstate="False" />
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;<p/>
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;<asp:datagrid id="MyDataGrid" runat="server" width="700"
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;backcolor="#ccccff" bordercolor="black" showfooter="false"
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;cellpadding="3" cellspacing="0" font-name="Verdana"
&#160; &#160;&#160; &#160;font-size="8pt"
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;headerstyle-backcolor="#aaaadd" enableviewstate="false" />
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;</form>
&#160; &#160;&#160; &#160;&#160; &#160;</body>
&#160; &#160;&#160; &#160;</html>
&#160; &#160;&#160; &#160;大部分代码都与前面的解决方案的代码相同。主要的不同点是第一行:
&#160; &#160;&#160; &#160;<%@ Page language="c#" Codebehind="Solution.aspx.cs"
&#160; &#160;&#160; &#160;&#160; &#160;AutoEventWireup="false" Inherits="Solution" %>
&#160; &#160;&#160; &#160;
&#160; &#160;&#160; &#160;这行告诉ASP.NET执行环境,这个页面的具体实现机制在一个单独的类中。因为这个页面是独立的,因此如果数据访问的代码发生变化,这个页面并不需要做任何改动。同样,一些设计师也可以改变这个页面的代码而不会引起任何数据访问的错误。
&#160; &#160;&#160; &#160;
&#160; &#160;&#160; &#160;在ASP.NET中实现Model-View-Controller模式(三)
&#160; &#160;&#160; &#160;
&#160; &#160;&#160; &#160;模型及控制器部分:
&#160; &#160;&#160; &#160;这个解决方案的第二个部分是被隐藏的后台代码:
&#160; &#160;&#160; &#160;using System;
&#160; &#160;&#160; &#160;using System.Data;
&#160; &#160;&#160; &#160;using System.Data.SqlClient;
&#160; &#160;&#160; &#160;
&#160; &#160;&#160; &#160;public class Solution : System.Web.UI.Page
&#160; &#160;&#160; &#160;{
&#160; &#160;&#160; &#160;&#160; &#160;protected System.Web.UI.WebControls.Button submit;
&#160; &#160;&#160; &#160;&#160; &#160;protected System.Web.UI.WebControls.DataGrid MyDataGrid;
&#160; &#160;&#160; &#160;&#160; &#160;protected System.Web.UI.WebControls.DropDownList recordingSelect;
&#160; &#160;&#160; &#160;&#160; &#160;
&#160; &#160;&#160; &#160;&#160; &#160;private void Page_Load(object sender, System.EventArgs e)
&#160; &#160;&#160; &#160;&#160; &#160;{
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;if(!IsPostBack)
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;{
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;String selectCmd = "select * from Recording";
&#160; &#160;&#160; &#160;
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;SqlConnection myConnection =
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;new SqlConnection(
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;
&#160; &#160;&#160; &#160;"server=(local);database=recordings;Trusted_Connection=yes");
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;SqlDataAdapter myCommand = new SqlDataAdapter(selectCmd,
&#160; &#160;&#160; &#160;myConnection);
&#160; &#160;&#160; &#160;
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;DataSet ds = new DataSet();
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;myCommand.Fill(ds, "Recording");
&#160; &#160;&#160; &#160;
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;recordingSelect.DataSource = ds;
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;recordingSelect.DataTextField = "title";
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;recordingSelect.DataValueField = "id";
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;recordingSelect.DataBind();
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;}
&#160; &#160;&#160; &#160;&#160; &#160;}
&#160; &#160;&#160; &#160;
&#160; &#160;&#160; &#160;&#160; &#160;void SubmitBtn_Click(Object sender, EventArgs e)
&#160; &#160;&#160; &#160;&#160; &#160;{&#160; &#160;
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;String selectCmd =
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;String.Format(
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;"select * from Track where recordingId = {0} order by id",
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;(string)recordingSelect.SelectedItem.Value);
&#160; &#160;&#160; &#160;
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;SqlConnection myConnection =
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;new SqlConnection(
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;"server=(local);database=recordings;Trusted_Connection=yes");
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;SqlDataAdapter myCommand = new SqlDataAdapter(selectCmd,
&#160; &#160;&#160; &#160;myConnection);
&#160; &#160;&#160; &#160;
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;DataSet ds = new DataSet();
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;myCommand.Fill(ds, "Track");
&#160; &#160;&#160; &#160;
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;MyDataGrid.DataSource = ds;
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;MyDataGrid.DataBind();
&#160; &#160;&#160; &#160;&#160; &#160;}
&#160; &#160;&#160; &#160;
&#160; &#160;&#160; &#160;&#160; &#160;#region Web Form Designer generated code
&#160; &#160;&#160; &#160;&#160; &#160;override protected void OnInit(EventArgs e)
&#160; &#160;&#160; &#160;&#160; &#160;{
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;//
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;// CODEGEN: This call is required by the ASP.NET Web Form Designer.
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;//
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;InitializeComponent();
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;base.OnInit(e);
&#160; &#160;&#160; &#160;&#160; &#160;}
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;
&#160; &#160;&#160; &#160;&#160; &#160;/// <summary>
&#160; &#160;&#160; &#160;&#160; &#160;/// Required method for Designer support - do not modify
&#160; &#160;&#160; &#160;&#160; &#160;/// the contents of this method with the code editor.
&#160; &#160;&#160; &#160;&#160; &#160;/// </summary>
&#160; &#160;&#160; &#160;&#160; &#160;private void InitializeComponent()
&#160; &#160;&#160; &#160;&#160; &#160;{&#160; &#160;
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;this.submit.Click += new System.EventHandler(this.SubmitBtn_Click);
&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;this.Load += new System.EventHandler(this.Page_Load);
&#160; &#160;&#160; &#160;
&#160; &#160;&#160; &#160;&#160; &#160;}
&#160; &#160;&#160; &#160;&#160; &#160;#endregion
&#160; &#160;&#160; &#160;}
&#160; &#160;&#160; &#160;
&#160; &#160;&#160; &#160;
&#160; &#160;&#160; &#160;这里将代码从上个实现方法单独的文件移动到了一个它自己的文件中。并通过一些机制把视图以及模型控制器这两个部分连接成一个整体,如这个类中的成员变量与Solution.aspx文件中所用的控件是同名的。另外一个必须显示指出的是控制器如何将行为与其所对应的事件进行连接。在这个例子中InitializeComponent函数连接了两个事件。第一个将Load事件与
&#160; &#160;&#160; &#160age_Load函数连接,第二个是Click事件,当Submit按钮被点击时调用SubmitBtn_Click函数。
&#160; &#160;&#160; &#160;
&#160; &#160;&#160; &#160;代码分离是一种将视图部分与模型及控制器部分相分离的一种优秀的机制。但当你想把分离出的后台的代码给其它页面重用时可能还是不足的。在技术上,将页面背后的代码复用是可行的,但随着你需要共享的页面的增加,把页面与后台代码相连接是很困难的。
                                                                             作者:fenon
在攻与防的對立统一中寻求突破...
回复

使用道具 举报

14

主题

61

帖子

71

积分

版主

Rank: 7Rank: 7Rank: 7

UID
15
精华
1
威望
1
贡献值
0
金币
799
在线时间
29 小时
注册时间
2013-8-16
最后登录
2014-7-5
QQ
发表于 2013-10-25 21:18:01 | 显示全部楼层
以前没见过这篇文章
回复 支持 反对

使用道具 举报

1298

主题

2305

帖子

2320

积分

理事

Rank: 8Rank: 8

UID
606
精华
1
威望
2
贡献值
0
金币
35709
在线时间
806 小时
注册时间
2013-10-29
最后登录
2014-11-15

优秀版主活跃会员

发表于 2013-10-31 18:06:29 | 显示全部楼层
电脑编程文章不易理解。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|日升家园 ( 蜀ICP备18009257号 )

GMT+8, 2024-5-17 17:47 , Processed in 0.060925 second(s), 27 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表