我对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);
}
}