Javascript、C#、php、asp、python 等语言的链式操作的实现
一、什么是链式操作
把需要的下一步操作的对象通过上一步操作返回回来。使完成某些功能具有持续性。
二、链式操作优点
代码更精简优雅。链式操作能大大精简代码量,多项操作一行代码一气呵成,搞定;
链式操作应用场景除了想前端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 等语言的链式操作的实现的更多相关文章
- C语言实现链式队列
链式队列,简称"链队列",即使用链表实现的队列存储结构. 链式队列的实现思想同顺序队列类似,只需创建两个指针(命名为 top 和 rear)分别指向链表中队列的队头元素和队尾元素, ...
- C语言 队列 链式结构 实现
一个C语言链式结构实现的队列 mQueue (GCC编译). /** * @brief C语言实现的链式队列 * @author wid * @date 2013-10-31 * * @note 若代 ...
- C语言 栈 链式结构 实现
一个C语言链式结构实现的栈 mStack (GCC编译). /** * @brief C语言实现的链式结构类型的栈 * @author wid * @date 2013-10-30 * * @note ...
- C语言数据结构-链式队列的实现-初始化、销毁、清空、长度、队列头元素、插入、删除、显示操作
1.数据结构-链式队列的实现-C语言 typedef struct QNode { int data; struct QNode *next; }QNode,*QueuePtr; typedef st ...
- Python自动化--语言基础6--模块操作之re、MySQL、Excel
1.Python自有模块正则 import re # re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None print(re.match("aaa ...
- Javascript 链式操作以及流程控制
春节过后,感觉过年吃的油腻的食品转化的脂肪都长到 脑子去了. 根本转不动啊 上班第一天 实在是写不动代码了, 顺手打开多天为看的 收件箱,查看查看邮件,看看春节期间 风云变幻的前端圈又有哪些大事发生. ...
- C语言实现链式二叉树静态创建,(先序遍历),(中序遍历),(后续遍历)
#include <stdio.h>#include <stdlib.h> struct BTNode{ char data ; struct BTNode * pLchild ...
- Javascript 优化项目代码技巧之语言基础(二)
上一篇随笔介绍了如何正确判断对象类型.避免变量污染,特殊值(null.undefined.NaN)的使用,以及其他Javascript中常用关键字与方法的优化,这篇随笔将着重介绍Javascr ...
- 30个深度学习库:按Python、C++、Java、JavaScript、R等10种语言分类
30个深度学习库:按Python.C++.Java.JavaScript.R等10种语言分类 包括 Python.C++.Java.JavaScript.R.Haskell等在内的一系列编程语言的深度 ...
随机推荐
- 【数学】【CF27E】 Number With The Given Amount Of Divisors
传送门 Description 给定一个正整数\(n\),输出最小的整数,满足这个整数有n个因子 Input 一行一个整数\(n\) Output 一行一个整数,代表答案. Hint \(1~\leq ...
- vmvare-centos7-vim
centos7网络连不上问题 http://geekflare.com/no-internet-connection-from-vmware-with-centos-7/ http://www.jia ...
- linux jq命令小结
http://note.youdao.com/noteshare?id=0d84ff04edcaa0be512eb0c1e5c41f47
- css等比例分割父级容器(完美三等分)
html部分代码: 方法一: 浮动布局+百分比 (将子元素依次左浮动,根据子元素的个数,设定每个子元素的宽度百分比) 方法二:行内元素(inline-block)+百分比 方法三: 父元素 disp ...
- 微信小程序踩过的坑
之前用小程序开发工具做过一个项目了,最近又新开了一个项目,在登录的时候发现总是提示code不合法,找了半天也未发现原因 后来同事提醒是不是因为开发工具里设置的AppId的问题,果断将当前工具里默认Ap ...
- [吴恩达机器学习笔记]14降维3-4PCA算法原理
14.降维 觉得有用的话,欢迎一起讨论相互学习~Follow Me 14.3主成分分析原理Proncipal Component Analysis Problem Formulation 主成分分析( ...
- Java设计模式の模版方法模式
概述 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的 ...
- hdu 4940 Destroy Transportation system (无源汇上下界可行流)
Destroy Transportation system Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 ...
- <LC刷题二>回文字符串判断之leetcode125&234
其他刷题记录见博客首页 1,leecode125 验证回文串 原题: 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写. 说明:本题中,我们将空字符串定义为有效的回文串. ...
- 搭建hibernate
需要导入的hibernate的包 其中所需要的依赖包 需要的配置文件 一个是元数据orm的配置文件 例如 package com.fmt.hibernate;public class Custome ...