一、什么是链式操作

  把需要的下一步操作的对象通过上一步操作返回回来。使完成某些功能具有持续性。

二、链式操作优点

  代码更精简优雅。链式操作能大大精简代码量,多项操作一行代码一气呵成,搞定;

  链式操作应用场景除了想前端jquery方面的操作dom,后端web框架,在开发orm相关的框架也是常常用到

三、各种语言的链式操作实现

  以下根据简单的实现数据库查询的类似实现一些web框架的 orm。查询类的各种DEMO

  1、javascript 的链式操作大家最熟悉不过了,jquery 的整个框架就是链式操作实现,我这里写的demo 当然跟jquery 实现的思路不是一致的,jquery具体实现方式可以看jquery源码。

var Link = function (table){
this.sql = {
"table" : "",
"where" : " 1=1 ",
"limit" : 0,
"field" : ""
}
this.sql.table = table;
}
Link.prototype = {
where : function (where)
{
this.sql.where += " and "+ where;
return this;
},
field : function (field)
{
this.sql.field = field;
return this;
},
top : function (limit)
{
this.sql.limit = limit;
return this;
},
query : function ()
{
var sqlstr = "SELECT "+this.sql.field+" FROM "+this.sql.table
+" WHERE "+ this.sql.where+ " LIMIT 0,"+this.sql.limit;
return sqlstr;
}
} var db = new Link("user");
var $val = db.where(" id = 1")
.top(10)
.field(" id, username , password")
.query(); console.log($val);

2、C# 实现链式,主要通过其.net 框架提供的扩展方法,代码如下

using System;

namespace ConsoleApplication1
{
public class sqlHelp
{
public sqlHelp (string table) {
this.table = table;
}
public string where = "";
public string field = "";
public int limit = ;
public string table = "";
} static class LinkExtended
{
public static sqlHelp Where(this sqlHelp h, string where)
{
h.where += " and"+ where;
return h;
}
public static sqlHelp Top(this sqlHelp h, int limit)
{
h.limit = limit;
return h;
} public static sqlHelp Field(this sqlHelp h, string field)
{
h.field = field;
return h;
}
public static string Query(this sqlHelp h)
{
string sql = string.Format("SELECT {0} FROM {1} WHERE 1=1 {2} LIMIT 0, {3}",
h.field, h.table, h.where, h.limit);
return sql;
}
} class Program
{
static void Main(string[] args)
{ sqlHelp db = new sqlHelp("user");
string sql = db.Top()
.Field("id, username, password")
.Where(" id =1")
.Query(); Console.WriteLine(sql);
Console.ReadLine(); }
} }

3、php 实现链式操作可以使用php的魔术方法_call。但是我这里实现还是愿意一开始说的返回对象本身的思路没有用到_call。

<?php

class Link
{
static public $_garr= array(
'table'=>'',
'limit' =>0,
'where' => ' 1=1 ',
'field' => ' '
);
function __construct($table)
{
self::$_garr['table'] = $table ;
}
public function where($where='')
{
self::$_garr['where'].= ' and '.$where ;
return $this;
}
public function field($field)
{
self::$_garr['field'] = $field ;
return $this;
}
public function top($top)
{
self::$_garr['limit'] = $top;
return $this;
} public function query()
{
$sql_arr = self::$_garr;
$sql = "SELECT {$sql_arr['field']} FROM {$sql_arr['table']} WHERE {$sql_arr['where']} LIMIT 0, {$sql_arr['limit']}";
return $sql;
} };
$db = new Link("user");
$sql = $db->top(10)
->field("id, username, password ")
->where(" id = 1")
->query();
print($sql); ?>

4、asp(vbscript)这个我一直在网上搜索资料也没见有人写过, 我自认为我这里写出来的是全网第一份(当然可能人家有我没找到而已,呵呵所以自我陶醉下),因为vbscript 本身的类是非常弱的,但是

也提供了 defalut  和 me 这样好用的特性,所以实现链式也不是什么难事( 如果熟练vbscript 的朋友可以能会想到 with .. end with 语言 其实这个语言本身有点链式的味道,但是思路上不叫链式操作)

Class Link
'声明一个全局字典
Dim sqlD public Default function construct(table)
Set sqlD = CreateObject("Scripting.Dictionary")
Call sqlD.add("table", table)
Set construct = me
End function Public Function where(whereStr)
Call sqlD.add("where", whereStr)
Set Where = me
End Function Public Function top(limit)
Call sqlD.add("limit", limit)
Set top = me
End Function Public Function field(fieldStr)
Call sqlD.add("field", fieldStr)
Set field = me
End Function Public Function query()
Dim sql
sql = "SELECT "& sqlD.item("field")&" FROM "&sqlD.item("table")&" WEHRE "&sqlD.item("where")
query = sql
End function End Class Dim db, sql
Set db = (New Link)("user")
sql = db.top().field("id, username, password").Where(" id = 1").query()
msgbox sql

5、python 实现链式非常的方便简单

class Link:

    def __init__(self, table):
self.table = table def where(self, where):
self.where = 'and ' +where
return self; def field(self, field):
self.field = field
return self def top(self, top):
self.limit = top
return self; def query(self):
sql = 'SELECT '+self.field+' FROM '+self.table+' WHERE 1=1 '+ self.where+' limit 0,'+self.limit
return sql p = Link('user')
sql = p.top(str(10)).field('id, username, password').where('id=1').query()
print(sql)

四、其他需要待续

  echosong 在码农生涯中,暂时只用到了以上些语言,所以目前也只实现了以上的语言链式操作,欢迎大家补充其他语言链式操作demo

Javascript、C#、php、asp、python 等语言的链式操作的实现的更多相关文章

  1. C语言实现链式队列

    链式队列,简称"链队列",即使用链表实现的队列存储结构. 链式队列的实现思想同顺序队列类似,只需创建两个指针(命名为 top 和 rear)分别指向链表中队列的队头元素和队尾元素, ...

  2. C语言 队列 链式结构 实现

    一个C语言链式结构实现的队列 mQueue (GCC编译). /** * @brief C语言实现的链式队列 * @author wid * @date 2013-10-31 * * @note 若代 ...

  3. C语言 栈 链式结构 实现

    一个C语言链式结构实现的栈 mStack (GCC编译). /** * @brief C语言实现的链式结构类型的栈 * @author wid * @date 2013-10-30 * * @note ...

  4. C语言数据结构-链式队列的实现-初始化、销毁、清空、长度、队列头元素、插入、删除、显示操作

    1.数据结构-链式队列的实现-C语言 typedef struct QNode { int data; struct QNode *next; }QNode,*QueuePtr; typedef st ...

  5. Python自动化--语言基础6--模块操作之re、MySQL、Excel

    1.Python自有模块正则 import re # re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None print(re.match("aaa ...

  6. Javascript 链式操作以及流程控制

    春节过后,感觉过年吃的油腻的食品转化的脂肪都长到 脑子去了. 根本转不动啊 上班第一天 实在是写不动代码了, 顺手打开多天为看的 收件箱,查看查看邮件,看看春节期间 风云变幻的前端圈又有哪些大事发生. ...

  7. C语言实现链式二叉树静态创建,(先序遍历),(中序遍历),(后续遍历)

    #include <stdio.h>#include <stdlib.h> struct BTNode{ char data ; struct BTNode * pLchild ...

  8. Javascript 优化项目代码技巧之语言基础(二)

        上一篇随笔介绍了如何正确判断对象类型.避免变量污染,特殊值(null.undefined.NaN)的使用,以及其他Javascript中常用关键字与方法的优化,这篇随笔将着重介绍Javascr ...

  9. 30个深度学习库:按Python、C++、Java、JavaScript、R等10种语言分类

    30个深度学习库:按Python.C++.Java.JavaScript.R等10种语言分类 包括 Python.C++.Java.JavaScript.R.Haskell等在内的一系列编程语言的深度 ...

随机推荐

  1. day5-python基础

  2. 简单shell 编程

    简单shell编程  by  dreamboy #!/bin/bash while true do echo clear echo echo " 系统维护菜单 " echo &qu ...

  3. Codeforces Round #546 (Div. 2) ABCDE 题解

    1136A: 题意:一本书有n个章节,每个章节的分别在li到ri页,小明读完书后将书折在第k页,问还有多少章节没有读 题解:控制k在li~ri的范围内后输出n-i即可 #include <set ...

  4. 把一个文件中所有文件名或者文件路径读取到一个txt文件,然后在matlab中读取

    链接: http://blog.csdn.net/dreamgchuan/article/details/51113295 dir /on/b/s  这个读取的是这样的格式:

  5. codeforces 872E. Points, Lines and Ready-made Titles

    http://codeforces.com/contest/872/problem/E E. Points, Lines and Ready-made Titles time limit per te ...

  6. dp ZOJ 3956

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3956 Course Selection System Time Limit ...

  7. 【IDEA】 Can't Update No tracked branch configured for branch master or the branch doesn't exist. To make your branch track a remote branch call, for example, git branch --set-upstream-to origin/master

    IDEA点击GIT更新按钮时,报错如下: Can't UpdateNo tracked branch configured for branch master or the branch doesn' ...

  8. 【BZOJ】1087: [SCOI2005]互不侵犯King

    [算法]状态压缩型DP [题解]http://www.cnblogs.com/xtx1999/p/4620227.html (orz) https://www.cnblogs.com/zbtrs/p/ ...

  9. hdu 5328 Problem Killer(杭电多校赛第四场)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5328 题目大意:找到连续的最长的等差数列or等比数列. 解题思路:1.等差等比的性质有很多.其中比较重 ...

  10. Linux 下解决安装多个node冲突的问题(重新安装node)

    一个系统中不经意安装了多个node版本,结果更新后还是原来的版本,下面思考一下解决办法: 敲黑板: 1. nodejs 用 包管理器安装一般在 /usr/local/bin 2. 查看当前目录下的no ...