Ruby on Rails - 自定义生成器和维护

时间:2014-05-07 14:15:36

标签: .net ruby-on-rails ruby ruby-on-rails-4

我对Ruby on Rails相当新,只使用它约6个月。以前我主要在.NET工作,并使用该框架构建了一些大型Web应用程序。一段时间以来,我一直是代码生成的支持者,这是我的下一个应用程序吸引我使用RoR的一部分。

在.NET世界中,我使用生成的代码,继承和部分类获得了很多成功,可以更轻松地实现生成代码的重构,增强和维护。本质上,在应用程序的每一层中,生成器用于创建具有核心功能的“基础”类。然后可以对这些基类进行子类分类,以根据需要扩展或修改行为,以满足每个特定组件的需求。

但是,随着时间的推移,我们经常需要对生成的代码进行更改,而不会覆盖手写的扩展代码。在.NET世界中,使用部分类来实现子类扩展/覆盖是非常易于管理的,将生成的代码文件与扩展代码文件分开。

我现在正试图决定如何在RoR世界中最好地完成同样的事情,并希望得到一些可能尝试类似方法的人的指导。我没有发现类似于ruby中的部分类的东西,但也许有不同的机制来完成同样的事情。

下面是我在.NET世界中如何组织代码的快速示例:

\生成\ BaseEmployee.cs

public abstract class BaseEmployee
{
  public BaseEmployee(string name, decimal salary)
  {
    this.Name = name;
    this.Salary = salary;
  }
  public string Name { get; protected set; }
  public decimal Salary { get; protected set; }
  public virtual void GiveRaise(decimal amount)
  {
    if (this.AuthorizeRaise(amount)) this.Salary += amount;
  }
  protected virtual AuthorizeRaise(decimal amount)
  {
    if (amount > this.Salary * 0.1) // no raises over 10%
      return false;
    else
      return true;
  }
}

\生成\ Employee.cs

public partial class Employee : BaseEmployee
{
  public Employee(string name, decimal salary) : base(name, salary) { }
}

\扩展\ Employee.cs

partial class Employee
{
  public Employee(string name, string title, decimal salary) 
    : base(name, title, salary) { }
  protected override AuthorizeRaise(decimal amount)
  {
    if (this.Name == "Mr. Dithers")  // this clown gets no raise
      return false;
    else
      return base.AuthorizeRaise(amount);
  }
}

0 个答案:

没有答案