厌倦了Web开发,寻找避免样板代码的极端方法 - 元框架?

时间:2014-05-09 17:01:08

标签: web code-generation

用现代网络框架编写了不少应用程序(Symfony2,Laravel,Rails,expressjs,angularjs ......)我无法帮助,但我认为我花费大约90%的时间用于编写CRUDs。然后我花了10%的时间做有趣的部分:基本上定义模型应该如何表现。

这是贬低,我想扭转比率。

上面提到的框架几乎都是为了使样板任务更容易,但是,它仍然不像我认为的那样容易,开发人员的大脑时间应该专注于应用逻辑,而不是写作样板代码。

我试着用Rails示例说明问题:

  1. 支持CRUD(例如rails generate scaffold user name:string email:string password:string
  2. 更改脚手架视图中的几行(可能是用户需要一个角色,但脚手架不知道如何处理它)
  3. ......做其他事......
  4. 意识到你想要使用twitter引导程序,添加我能找到的最神奇的宝石来帮助我......
  5. 重新构建我的用户CRUD
  6. 重新对视图执行的各种编辑,现在他们已被scaffold覆盖
  7. ...
  8. 这将持续一段时间。

    在我看来,rails generate等大多数魔法工具只会帮助您进行初始设置。在那之后,你自己。它看起来并不像DRY那样。

    我会更加极端:作为开发人员,我应该能够在不担心用户界面的情况下构建整个项目(并且不会将任务委托给其他人)。

    如果在项目中我需要具有角色的用户,我希望能够编写一个包含以下内容的.json文件:

    {
        "Schema": {
            "User": {
                "name" : "string",
                "email": "email (unique)",
                "password": "string",
                "role": "Role"
            },
            "Role": {
                "name": "string (unique)"
            }
        }
    }
    
    然后我会让框架创建数据库表,相应的视图和控制器。如果我想为UI使用bootstrap,则会有一个设置在master .json文件中切换它。在任何时候我都不会编辑单个视图。如果稍后我向用户添加字段或想要更改UI样式,我只需编辑主.json文件。

    这将为UX设计的创意分支开辟道路。例如,我可以为User模型的每个字段分配一个重要性标志,让一个聪明的设计师编写一个插件来设计其布局通过字段的相对重要性进行优化的表单。这不是我的工作,也不是UX设计师的工作。工作要为不同的项目重写相同的东西100次,他们应该写"食谱"这适用于一般的,明确的案例。

    我有一种感觉,MVC模式具有所有优点,过多地将视图与模型分离。您有多少次必须编写两次验证码:一次是服务器端,一次是客户端,因为您需要更丰富的反馈?从模型中可以获得很多信息,您应该能够通过在模型上设置属性来告知框架,从而获得客户端验证。

    你可能会说Rails脚手架接近我想象的,当然。但脚手架只在项目开始时才有用。即使使用脚手架,我也需要重写许多内容,比如只允许管理员更改用户的角色。

    理想的框架将为我提供一个简单的钩子来定义是否允许更改用户的角色字段的操作,如果我从钩子中正确地返回错误,UI将自动向用户显示错误

    编写用户系统应该只需几分钟。即使使用Rails设计或Symfony2的FOSUserBundle,也需要进行大量的,不必要的配置和调整。

    理论上,我想到的元框架可用于生成任何现代Web框架的样板代码。

    我希望我的开发工作流程看起来像这样:

    1. 创建定义模型及其关系的app.json文件,+我想要专门化的钩子
    2. 运行generate_app app.json --ui=bootstrap --forms=some_spectacular_plugin --framework=rails4
    3. 之类的命令
    4. 实现我需要的钩子
    5. 完成。
    6. 每当app.json发生变化时,生成的应用程序就会自动更新,添加实体,字段,自定义逻辑应该永远不会比编写几行JSON并在目标语言中实现逻辑的有趣部分更难。

      我坚信,那里的大量框架解决了错误的问题:如何更有效地编写少量未连接的代码。框架应该问:什么是应用程序,我该如何描述它?

      你知道会朝这个方向发展的任何项目吗?有关此文献的任何指示?

1 个答案:

答案 0 :(得分:1)

我已经多次面对类似的发展轮胎 - 一个结束的样板。对我来说,锅炉板不会带来任何额外的商业价值(静态:项目设置,上下文:CRUD(后端,前端),下拉列表,子用作矫揉造作......等等......)

提出的方法是轨道脚手架工件的命令行生成,其具有以下缺陷:维护不完整和脆弱。 生成涵盖了在不同类型的工件(数据库存储,表示层,持久层等等)上生成相同信息(冗余信息)的方面。

此外,连续生成会覆盖您的更改。

为了解决这个不便,我只看到两个解决方案:

  • 不要使用生成器,而是在一个中心位置管理持久性和表示方面的通用框架。在java中,有Openxava专为此而设计。它与注释(持久​​性和表示)一起使用,它还以刻板印象回答您的验证问题。

  • 使用可更新生成的代码生成器。 Minuteproject获取可更新生成的代码功能。您可以修改生成的零件,下一代可以保留您的修改。 同时,这些解决方案都不符合您的技术目标(Rails)。

可以扩展Minuteproject以生成任何基于文本的语言(java,ruby,python,c,js ......)。

Minuteproject根据数据库结构,查询语句,传输对象定义生成,请参阅productivity facet for analysts

备注:minuteproject还为Openxava

提供了逆向工程解决方案

在提议的序列摘要中:

  1. 创建模型,关系+钩子,我宁愿将DB模型视为中心位置,并在模型丰富中添加钩子(尚未存在)(minuteproject提出了一个专门用于丰富模型的约定......) 我倾向于使用逆向工程解决方案而不是正向工程,原因如下:

    • 正确的数据库存储太重要了,无法生成:
    • 正向工程无法生成视图,存储过程,功能等...
    • 正向工程可能无法正确调整(表空间)持久性模型。
  2. 通过提升您的技术目标来生成

  3. 在可更新生成的代码段中实现了钩子,因此在下一代(模型结构已经改变,将实现新的钩子)时,保留了之前的钩子实现。

    < / LI>

    我为Openxava创建了一些待实现的(钩子)(http://minuteproject.blogspot.be/2013/08/transient-definition-as-productivity.html

    但是,minproject方法与技术无关,因此可以为其他框架生成工件。