什么是流利语法Fluent Syntax

2024-05-03 21:38
文章标签 语法 fluent 流利 syntax

本文主要是介绍什么是流利语法Fluent Syntax,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!



出处:http://blog.csdn.net/u010019717

author:孙广东      时间:2015.3.18   23:00


编程新概念:什么是流利语法fluent syntax
首先感谢 unity的一款插件 DFTween (内容如下http://blog.csdn.net/u010019717/article/details/44359119),通过学习它知道了流利语法的概念。

Fluent interface连贯接口

在软件工程,一种Fluent interface连贯接口(作为首先由Eric EvansMartinFowler创造)是面向对象的API,旨在提供更具可读性的代码执行。

        Fluent interface通常通过使用methodcascading方法级联(具体methodchaining方法链接)context指令连续调用执行 (但Fluent interface需要不仅仅是方法链接)。通常context上下文是

·定义通过返回值(类对象)调用方法

·以自我作为参照,在新的背景下是相当于最后一个context上下文

·通过返回一个void的上下文终止。

内容

1 History

2 Examples

2.1 JavaScript

2.2 Java

2.3 C++

2.7 PHP

2.8 C#

2.9 Python

历史

术语"Fluent interface"是在 2005 年年底提出,虽然这种interface面的整体风格追溯到 1970 年代,Smalltalk 在级联的方法被发明,在上世纪 80 年代的许多例子。最熟悉的是在 c + +,使用iostream<<>> 运算符为消息传递、将多个数据发送到同一个对象和其他方法调用允许"manipulators"

 例子

JavaScript

有很多使用几种变体的 JS 库的例子:可能是最广为人知的 jQuery。通常用fluent builders流利的建设者来实现 'DB 查询',例如https://github.com/Medium/dynamite :

// getting an item from a tableclient.getItem('user-table').setHashKey('userId', 'userA').setRangeKey('column', '@').execute().then(function(data) {// data.result: the resulting object})

简单的办法做到这一点在 javascript 中使用prototype inheritance原型继承和 this

// example from http://schier.co/post/method-chaining-in-javascript// define the classvar Kitten = function() {this.name = 'Garfield';this.color = 'brown';this.gender = 'male';};Kitten.prototype.setName = function(name) {this.name = name;return this;};Kitten.prototype.setColor = function(color) {this.color = color;return this;};Kitten.prototype.setGender = function(gender) {this.gender = gender;return this;};Kitten.prototype.save = function() {console.log('saving ' + this.name + ', the ' +this.color + ' ' + this.gender + ' kitten...');// save to database here...return this;};// use itnew Kitten().setName('Bob').setColor('black').setGender('male').save();

更通用的方式做到这一点是在mu-ffsm中实现.

var mkChained = function(spec) {return function(init) {var s = spec[0] ? spec[0](init) : 0;var i = function(opt) {return spec[1] ? spec[1](s, opt) : s;}Object.keys(spec).forEach(function(name){// skip `entry` and `exit` functionsif(/^\d+$/.test(name))return;// transition 'name : (s, opt) -> s'i[name] = function(opt) {s = spec[name](s, opt);return i;};});return i;}};var API = mkChained({0:    function(opt)    {return ;/* create initial state */},then: function(s, opt) {return s; /* new state */},whut: function(s, opt) {return s; /* new state */},1:    function(s, opt) {return ;/* compute final value */}});// We create an instance of our newly crafted API,var call = API() // entry.whut()       // transition.then()       // transition.whut();      // transition// And call itvar result0 = call() // exit, result1 = call() // exit
 

Java

JOOQ型号的库作为 fluent API Java 中的 SQL

Author a = AUTHOR.as("a");create.selectFrom(a).where(exists(selectOne().from(BOOK).where(BOOK.STATUS.eq(BOOK_STATUS.SOLD_OUT)).and(BOOK.AUTHOR_ID.eq(a.ID))));

Op4j库使fluent流畅代码,用于执行辅助任务结构迭代、 数据转换、 过滤等。

String[] datesStr = new String[] {"12-10-1492", "06-12-1978"};...List<Calendar> dates = Op.on(datesStr).toList().map(FnString.toCalendar("dd-MM-yyyy")).get();

Fluflu注释处理器可以使用 Java 注释 fluent API创建。

JaQue使 Java 8 lambda 时必须表示为表达式目录树在运行时,使它能够即创建类型安全连贯接口,而不是窗体中的对象:

Customer obj = ... obj.property("name").eq("John")一种学法:method<Customer>(customer -> customer.getName() == "John")

C + +

C + +中,一个fluentinterface常见用途是的标准iostream,其中链重载的运算符.

以下是提供在更传统的界面,在 c + + 中的fluent interface包装程序的示例:

 

// Basic definitionclass GlutApp { private:int w_, h_, x_, y_, argc_, display_mode_;char **argv_;char *title_;public:GlutApp(int argc, char** argv) {argc_ = argc;argv_ = argv;}void setDisplayMode(int mode) {display_mode_ = mode;}int getDisplayMode() {return display_mode_;}void setWindowSize(int w, int h) {w_ = w;h_ = h;}void setWindowPosition(int x, int y) {x_ = x;y_ = y;}void setTitle(const char *title) {title_ = title;}void create(){;}};// Basic usageint main(int argc, char **argv) {GlutApp app(argc, argv);app.setDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_ALPHA|GLUT_DEPTH); // Set framebuffer paramsapp.setWindowSize(500, 500); // Set window paramsapp.setWindowPosition(200, 200);app.setTitle("My OpenGL/GLUT App");app.create();}// Fluent wrapperclass FluentGlutApp : private GlutApp {public:FluentGlutApp(int argc, char **argv) : GlutApp(argc, argv) {} // Inherit parent constructorFluentGlutApp &withDoubleBuffer() {setDisplayMode(getDisplayMode() | GLUT_DOUBLE);return *this;}FluentGlutApp &withRGBA() {setDisplayMode(getDisplayMode() | GLUT_RGBA);return *this;}FluentGlutApp &withAlpha() {setDisplayMode(getDisplayMode() | GLUT_ALPHA);return *this;}FluentGlutApp &withDepth() {setDisplayMode(getDisplayMode() | GLUT_DEPTH);return *this;}FluentGlutApp &across(int w, int h) {setWindowSize(w, h);return *this;}FluentGlutApp &at(int x, int y) {setWindowPosition(x, y);return *this;}FluentGlutApp &named(const char *title) {setTitle(title);return *this;}// It doesn't make sense to chain after create(), so don't return *thisvoid create() {GlutApp::create();}};// Fluent usageint main(int argc, char **argv) {FluentGlutApp(argc, argv).withDoubleBuffer().withRGBA().withAlpha().withDepth().at(200, 200).across(500, 500).named("My OpenGL/GLUT App").create();}

PHP

PHP 中,一个人可以通过使用$this 特殊的变量所表示的实例返回当前对象。因此返回 $this ;将使返回的实例的方法。下面的示例定义一个类Employee和三种方法来设置其name, surname salary。每个返回Employee类允许对链方法的实例。

<?phpclass Employee{public $name;public $surName; public $salary;public function setName($name){$this->name = $name;return $this;}public function setSurname($surname){$this->surName = $surname;return $this;}public function setSalary($salary){$this->salary = $salary;return $this;}public function __toString(){$employeeInfo = 'Name: ' . $this->name . PHP_EOL;$employeeInfo .= 'Surname: ' . $this->surName . PHP_EOL;$employeeInfo .= 'Salary: ' . $this->salary . PHP_EOL;return $employeeInfo;}}# Create a new instance of the Employee class:$employee = new Employee();# Employee Tom Smith has a salary of 100:echo $employee->setName('Tom')->setSurname('Smith')->setSalary('100');# Display:# Name: Tom# Surname: Smith# Salary: 100

 

C#

C# 使用fluentLINQ中广泛编程来生成使用标准查询运算符的查询。基于扩展方法.

var translations = new Dictionary<string, string>{{"cat", "chat"},{"dog", "chien"},{"fish", "poisson"},{"bird", "oiseau"}};// Find translations for English words containing the letter "a",// sorted by length and displayed in uppercaseIEnumerable<string> query = translations.Where   (t => t.Key.Contains("a")).OrderBy (t => t.Value.Length).Select  (t => t.Value.ToUpper());// The same query constructed progressively:var filtered   = translations.Where (t => t.Key.Contains("a"));var sorted     = filtered.OrderBy   (t => t.Value.Length);var finalQuery = sorted.Select      (t => t.Value.ToUpper());Fluent interface也可以用于链设置方法,其中operates/shares相同的对象。而不是创建一个customer类我们可以创建一个data context数据上下文,可以用fluent interface,如下所示://defines the data contextclass Context{public string fname { get; set; }public string lname {get; set;}public string sex { get; set; }public string address { get; set; }}//defines the customer classclass Customer{Context context = new Context(); //initializes the context// set the value for propertiespublic Customer FirstName(string firstName){context.fname = firstName;return this;}public Customer LastName(string lastName){context.lname = lastName;return this;}public Customer Sex(string sex){context.sex = sex;return this;}public Customer Address(string address){context.address = address;return this;}//prints the data to consolepublic void Print(){Console.WriteLine("first name: {0} \nlast name: {1} \nsex: {2} \naddress: {3}",context.fname,context.lname,context.sex,context.address);}}class Program{static void Main(string[] args){//object creationCustomer c1 = new Customer();//using the method chaining to assign & print data with a single linec1.FirstName("vinod").LastName("srivastav").Sex("male").Address("bangalore").Print();}}

Python

Python 返回 'self' 中的实例方法是实现fluent pattern的一种方法。

class Poem(object):def __init__(self, content):self.content = contentdef indent(self, spaces):self.content = " " * spaces + self.contentreturn selfdef suffix(self, content):self.content = self.content + " - " + contentreturn selfPoem("Road Not Travelled").indent(4).suffix("Robert Frost").content'    Road Not Travelled - Robert Frost'

更详细的内容观看维基百科:https://en.wikipedia.org/wiki/Fluent_interface



这篇关于什么是流利语法Fluent Syntax的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/957699

相关文章

C++语法知识点合集:11.模板

文章目录 一、非类型模板参数1.非类型模板参数的基本形式2.指针作为非类型模板参数3.引用作为非类型模板参数4.非类型模板参数的限制和陷阱:5.几个问题 二、模板的特化1.概念2.函数模板特化3.类模板特化(1)全特化(2)偏特化(3)类模板特化应用示例 三、模板分离编译1.概念2.模板的分离编译 模版总结 一、非类型模板参数 模板参数分类类型形参与非类型形参 非类型模板

Java基础回顾系列-第一天-基本语法

基本语法 Java基础回顾系列-第一天-基本语法基础常识人机交互方式常用的DOS命令什么是计算机语言(编程语言) Java语言简介Java程序运行机制Java虚拟机(Java Virtual Machine)垃圾收集机制(Garbage Collection) Java语言的特点面向对象健壮性跨平台性 编写第一个Java程序什么是JDK, JRE下载及安装 JDK配置环境变量 pathHe

Hibernate框架中,使用JDBC语法

/*** 调用存储过程* * @param PRONAME* @return*/public CallableStatement citePro(final String PRONAME){Session session = getCurrentSession();CallableStatement pro = session.doReturningWork(new ReturningWork<C

ORACLE语法-包(package)、存储过程(procedure)、游标(cursor)以及java对Result结果集的处理

陈科肇 示例: 包规范 CREATE OR REPLACE PACKAGE PACK_WMS_YX IS-- Author : CKZ-- Created : 2015/8/28 9:52:29-- Purpose : 同步数据-- Public type declarations,游标 退休订单TYPE retCursor IS REF CURSOR;-- RETURN vi_co_co

ElasticSearch的DSL查询⑤(ES数据聚合、DSL语法数据聚合、RestClient数据聚合)

目录 一、数据聚合 1.1 DSL实现聚合 1.1.1 Bucket聚合  1.1.2 带条件聚合 1.1.3 Metric聚合 1.1.4 总结 2.1 RestClient实现聚合 2.1.1 Bucket聚合 2.1.2 带条件聚合 2.2.3 Metric聚合 一、数据聚合 聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如:

react笔记 8-16 JSX语法 定义数据 数据绑定

1、jsx语法 和vue一样  只能有一个根标签 一行代码写法 return <div>hello world</div> 多行代码返回必须加括号 return (<div><div>hello world</div><div>aaaaaaa</div></div>) 2、定义数据 数据绑定 constructor(){super()this.state={na

python基础语法十一-赋值、浅拷贝、深拷贝

书接上回: python基础语法一-基本数据类型 python基础语法二-多维数据类型 python基础语法三-类 python基础语法四-数据可视化 python基础语法五-函数 python基础语法六-正则匹配 python基础语法七-openpyxl操作Excel python基础语法八-异常 python基础语法九-多进程和多线程 python基础语法十-文件和目录操作

python进阶篇-day07-高级语法与正则

day07-python其他高级语法 一. with(上下文管理) 介绍 概述 一个类只要实现了__ enter __ () 和 __ exit __ ()方法, 这个类就是一个上下文管理器类, 该类的对象 = 上下文管理器对象 目的 节约资源, 提高效率, 避免手动释放资源, 且出bug的时候, 也会自动尝试释放资源 特点 上下文管理器对象, 可以结合with语句使用

javaweb-day01-4(DTD 的语法)

XML 文件中 DOCTYPE 声明语句的格式: XML 文件使用 DOCTYPE 声明语句来指定它所遵循的 DTD 文件。 DOCTYPE声明语句有两种形式: 1.  当引用的约束文件在本地硬盘时,使用如下方式: <!DOCTYPE    xml文档根节点    SYSTEM    "dtd文档在本地的绝对路径或相对路径"> 例如:<!DOCTYPE 书架 SYSTEM "book

javaweb-day01-2(00:17:48 XML 的作用 和 语法)

XML: 描述 可扩展标记语言,w3c  2000年发布的 XML 1.0 版本规范。 用来描述数据之间的关系。 经常用作 软件  的配置文件,描述 模块与模块 之间的关系。 还用作    软件启动  的配置文件,描述 启动模块之间的 依赖 关系。 语法 一个XML文件分为如下几部分内容: 文档声明元素属性注释CDATA区、转义字符处