`

ActiveRecord是什么&元编程简介

阅读更多

回复:什么是ActiveRecord

ActiveRecord 是什么:
1. 每一个数据库表对应创建一个类.类的每一个对象实例对应于数据库中表的一行记录; 通常表的每个字段在类中都有相应的Field;
2. ActiveRecord同时负责把自己持久化. 在ActiveRecord中封装了对数据库的访问, 即CRUD;
3. ActiveRecord是一种领域模型(Domain Model), 封装了部分业务逻辑;

ActiveRecord 不是什么:
1. Row Data Gateway
Row Data Gateway模式中每个对象也封装了数据库记录的状态和持久化到数据库的访问方法; 这两个有时候很难区分. 细微的区别在于Row Data Gateway不封装任何业务逻辑;

2. TableGateway
TableGateway是一种数据访问模式, 对每个表有一个类, 类的方法封装了对单个表的数据操作, 如CRUD; 方法的接受表字段的值作为参数;
比如说对表Person有DAOPerson, 有以下方法:
int Create(string name, bool isMale)
DataSet Find(int personId)
void Delete(int personId)
void Update(int personId, string name, bool isMale)
微软的很多代码示例中使用了此模式;

ActiveRecord的区别在于ActiveRecord的对象中保持了记录的值, 是有状态的, 而TableGateway是没有状态的, 只是一系列数据库访问方法的集合;

3. Table Module
Table Module是一种领域逻辑模式, 一个类对应于数据库中的一个表; Table Module通常和Table Gateway合作, 前者负责基本的业务逻辑, 后者负责数据库访问, 以达到逻辑层和持久化层的隔离; 微软的实例代码经常使用这两者, 如对表Person, 通常会定义两个类, PersonBL和PersonDB, 在PersonBL中处理验证等逻辑, 并调用PersonDB访问数据库, 层间调用使用DataSet或自定义数据传输对象传输数据

在业务逻辑比较简单并且有和表的一一对应时, ActiveRecord相对来说更简单, 因为它在一个类中包括了业务逻辑对象和数据访问, 而且不需要数据传输对象, 减少了维护的工作量;
和Table Module比较起来, ActiveRecord与数据库耦合更紧;

ActiveRecord 适用于:
1. 业务逻辑比较简单;当你的类基本上和数据库中的表一一对应时, ActiveRecord是非常方便的, 即你的业务逻辑大多数是对单表操作;

2. 当发生跨表的操作时, 往往会配合使用事务脚本(Transaction Script), 把跨表事务提升到事务脚本中;

3. ActiveRecord最大优点是简单, 直观; 一个类就包括了数据访问和业务逻辑. 如果配合代码生成器使用就更方便了;

4. 这些优点使ActiveRecord特别适合web快速开发, 而正是快速开发框架ROR采用了ActiveRecord, 并且很多类ROR框架如Castle的纷纷效仿才使ActiveRecord重新进入大家视线;
我想这也是为什么Martin Fowler在PoEAA中早就提出了这个模式, 但是直到最近两三年ActiveRecord才热起来可能就是这个原因;

ActiveRecord 不适合于
1. ActiveRecord虽然有业务逻辑, 但基本上都是基于单表的. 跨表逻辑一般会放到当发生跨表的操作时, 往往会配合使用事务脚本(Transaction Script)中. 如果对象间的关联越来越多, 你的事务脚本越来越庞大, 重复的代码越来越多, 你就要考虑Domain Model + O/R Mapper了;

2. ActiveRecord保存了数据, 使它有时候看上去像数据传输对象(DTO). 但是ActiveRecord有数据库访问能力, 不要把它当DTO用. 尤其在跨越进程边界调用的时候, 不能传递ActiveRecord对象;

 

 

元编程艺术,第 1 部分: 元编程简介

目前应用最广泛的技术之一是编写生成其他程序或部分程序的程序。因此十分有必要学习为什么要采用元编程,以及元编程都有哪些组件(文本宏语言,专用代码生成器)。在本文中,您将学习到如何构建一个代码生成器,并详细了解如何使用 Scheme 编写对语言敏感的宏。

用来生成代码的程序有时被称为 元程序(metaprogram) ;编写这种程序就称为 元编程(metaprogramming) 。编写这种输出代码的程序可以有无数的应用。

本文将介绍为什么会考虑进行元编程,并介绍这种技术的一些组件 —— 我们将深入介绍文本宏语言(textual macro language),了解专用的代码生成器,并讨论如何构建这些工具,最后研究如何使用 Scheme 编写对语言敏感的宏。

元编程的不同用法

首先,可以编写一些程序来提前生成一些数据供运行时使用。例如,如果您正在开发一个游戏,并且希望使用一个所有 8 位整数的正弦值的查询表,既可以每次都执行正弦计算的操作,也可以让程序在启动时构建这样的一张表在运行时使用,或者编写一个程序在编译之前为这个表生成 定制代码。尽管对于少量的数据来说在运行时构建这张表是可能的,但是有些任务则可能会使得程序启动非常缓慢。在这种情况中,编写一个程序来构建一张静态表 通常是最好的解决方案。

其次,如果您有一个很大的应用程序,这个程序有很多函数都包括了很多样板文件,那么就可以创建一个小型的语言,它可以生成这些样板代码,让您可以只 实现重要的部分。现在,如果可以,最好是能够将这些样板部分抽象成一个函数。但是通常来说,这些样板代码并不会如此精美。可能每个实例中都需要声明一些变 量,可能需要注册错误处理程序,或者有一些样板文件必须在某些情况中插入一些代码。所有这些都使得简单的函数调用是不可能的。在这种情况中,通常创建一个 小型的语言来更简单地利用样板文件的代码。这种小型的语言可以在编译之前被转换成普通的源代码语言。

最后,有很多编程语言都可以编写非常复杂的语句来真正实现一些功能。代码生成程序可以对这种语句进行简化,并节省很多输入的工作,这可以防止大量的输入错误,因为减少了很多输入错误内容的机会。

作为语言可以有很多特性,代码生成程序就不需要这么多了。一种语言中的标准特性在另外一种语言中可能只能通过代码生成程序实现。然而,语言设计不充分并不是需要代码生成程序的唯一原因。维护简单也是一个原因。

分享到:
评论

相关推荐

    Ruby on Rails中的ActiveRecord编程指南

    主要介绍了Ruby on Rails中的ActiveRecord编程指南,作者对编写ActiveRecord的通用习惯给出了建议,需要的朋友可以参考下

    rgeo-activerecord:RGeo ActiveRecord扩展和用于空间连接适配器的工具

    RGeo是使用Ruby编程语言编写位置感知应用程序的关键组件。 其核心是行业标准OGC简单功能规范的实现,该规范提供了几何对象(如点,线和面)的数据表示,以及一组几何分析操作。 有关更多信息,请参见“ rgeo” gem的...

    ruby元编程之创建自己的动态方法

    method_missing是Ruby元编程(metaprogramming)常用的手法。基本思想是通过实现调用不存在的方法,以便进行回调。典型的例子是:ActiveRecord的动态查找(dynamic finder)。例如:我们有email属性那么就可以调用...

    在Ruby on Rails中优化ActiveRecord的方法

    Ruby on Rails 编程常常会将您宠坏。这一不断发展的框架会让您从其他框架的沉闷乏味中解脱出来。您可以用习以为常的几行代码片断表达自己的意图。而且还可以使用 ActiveRecord。 对于我这样的一个老 Java? 程序员而...

    pp_sql:Rails ActiveRecord SQL查询日志美化器

    编程语言 用 gem替换标准ActiveRecord#to_sql方法, 在控制台中输出漂亮SQL代码。 Rails日志也将被格式化。 输出示例: 或在控制台中 要求 Ruby2.4+ 滑轨 Rails 4.2+(可选),将自动注入 遗产 您可以将此版本的~>...

    ObjectiveSql:ObjectiveSQL是Java中基于ActiveRecord模式的ORM框架,该框架鼓励快速开发和整洁,代码最少且约定俗成的配置

    产品特点通过一个注释,您的Class具有SQL编程的全功能易于进行关系( has_one , has_many和belongs_to )查询和分页查询使用Java语法编写SQL表达式( arithmetic , comparison和logical )为什么选择如果您的项目...

    提升Ruby on Rails性能的几个解决方案

    简介 Ruby On Rails 框架自它提出之日起就受到广泛关注,在“不要重复自己”,“约定优于配置”等思想的指导下,Rails 带给 Web 开发者的是极高的开发效率。 ActiveRecord 的灵活让你再也不用配置繁琐的 Hibernate ...

    CakePHP(PHP的框架)v3.7.8

    CakePHP是一个用PHP编写的开源Web应用框架,不过其模型是用Ruby ...在cakephp.org站点的Sites in the wild页面可以看到当前使用CakePHP框架的网站列表。 CakePHP 是一个运用了诸如ActiveRecord、Association Data Map

    web开发_ruby_on_rails

    准的编程模式,比如ActiveRecord 以及Model-View-Controller。它重用很多已经存在 的Ruby 库(比如Rake和ERb)。Rails 的功能在于集成这些标准的技术自动化完成任务, 并且会断言合理的默认行为。

    ruby声明式语法的实现例子

    在ActiveRecord可以用很方便的声明方式来定义model之间的关联关系,例如: 代码如下: class Topic < ActiveRecord::Base  has_many :posts  belongs_to :user end has_many和belongs_to其实是Topic类的class ...

    MMPCoreDataHelper:轻巧的ActiveRecord和受LINQ启发的功能包装,适用于CoreData

    用于常见CoreData任务的轻量级帮助程序库,提供了受 , 和功能编程启发的数据访问模式。 即使该库没有您需要的功能,您也可以始终使用标准的CoreData,但可以使用线程安全的上下文。 特征: 线程安全的单例实例可...

    基于c#GDI的图形绘制程序。

    基于c#GDI的图形绘制程序,方便初学者学习GID绘图编程。 图形数据存放在SqlServer数据库中 采用了ActiveRecord进行数据库访问。 运行环境: WindowsXP 以上 Sqlserver2005 .net Framework4.0

    基于c#GDI的图形绘制程序源代码

    基于c#GDI的图形绘制程序,方便初学者学习GID绘图编程。 图形数据存放在SqlServer数据库中 采用了ActiveRecord进行数据库访问。 运行环境: WindowsXP 以上 Sqlserver2005 .net Framework4.0

    ProtoRails:Rails 的核心功能,我从头开始构建

    在元编程的壮举中,我重新创建了 ActiveRecord 和 ActionController 的核心功能,它们分别是 Ruby on Rails 模型和控制器的基类。 使用我的精简版 Rails,您可以创建一个带有关联、Flash 甚至用户身份验证的基本网站...

    Ruby on Rails Web开发之旅.pdf【第二部分】

     4.3.3 ActiveRecord(模型)  4.3.4 ActionPck模块  4.4 代码生成  4.5 ActionMailer  4.6 测试和调试  4.6.1 测试  4.6.2 调试  4.7 MySQL的图形用户接口工具  4.8 小结 第5章 模型、视图和控制...

    Ruby on Rails Web开发之旅.pdf【第一部分】

     4.3.3 ActiveRecord(模型)  4.3.4 ActionPck模块  4.4 代码生成  4.5 ActionMailer  4.6 测试和调试  4.6.1 测试  4.6.2 调试  4.7 MySQL的图形用户接口工具  4.8 小结 第5章 模型、视图和控制...

    Ruby on Rails Web开发之旅.pdf【第三部分】

     4.3.3 ActiveRecord(模型)  4.3.4 ActionPck模块  4.4 代码生成  4.5 ActionMailer  4.6 测试和调试  4.6.1 测试  4.6.2 调试  4.7 MySQL的图形用户接口工具  4.8 小结 第5章 模型、视图和控制...

    在Python的Django框架上部署ORM库的教程

    Python ORM 概览 作为一个美妙的语言,Python 除了 SQLAlchemy 外还有很多ORM库。...得益于其类似于Ruby on Rails的ActiveRecord模式,在编程社区变得越来越流行。首个 SQLObject在2002年十月发布。它遵循LGPL

    Scala程序设计(第2版)

    第24章 元编程:宏与反射 454 24.1 用于理解类型的工具 455 24.2 运行时反射 455 24.2.1 类型反射 455 24.2.2 ClassTag、TypeTag与Manifest 457 24.3 Scala 的高级运行时反射API 458 24.4 宏 ...

Global site tag (gtag.js) - Google Analytics