我一直在努力解决设计问题,我承认我是OOP和RoR的新手,所以我确信这将是非常基础的。我有一个应用程序,我从各种格式的文本文件中读取,以解析与扑克手有关的信息。所以我拥有三个实体:
文件对象。它存储文件的名称和路径以及一些其他属性,并具有与从文件读取相关的功能。这是MVC,因为我可以添加文件并自动更新,或者我可以动态解析文件中的信息。
扑克手牌。这基本上只是存储有关谁玩扑克之手以及行动和结果的信息。
解析器。这将根据正在读取的文件类型读取具有不同正则表达式模式的外部JSON文件。它还在JSON文件中有一些基本的状态机信息,以便从解析器中删除很多逻辑。
所以我对解析器的初步感觉是它应该是它自己的对象。但后来我意识到它没有V或C,因此可能不适合Rails的做事方式。并且它也没有除文件对象之外的任何对象所需的任何功能,因此似乎适合文件。但同时它与文件对象明显不同,它似乎不合适。我想到了一个模块,但模块的重点似乎是多个对象共享某些函数的需求,在这种情况下只有文件才有。
它应该是它自己的对象,是在文件对象中,还是有其他一些我没有看到的选择?
答案 0 :(得分:2)
关于MVC中是否应该是“M”的决定应该基于它是否具有任何持久性(数据库驱动)数据。
模型不需要控制器或视图,控制器不必与模型一对一映射。但是,常见的“RESTful API”方法确实会产生强大的模型< =>控制器通信。
在你的情况下,它听起来只是一块代码,它接受输入并返回一些其他已定义的模型,因此它可能最适合作为lib/
文件夹中的一个模块,你可以从您的其他型号或控制器
答案 1 :(得分:1)
但后来我意识到它没有V或C,所以可能不适合Rails的做事方式。
在我看来,它没有V或C的事实无关紧要。
如果您觉得解析器属于文件,那么请将其粘贴在那里。但是如果你不这样做(对我而言听起来不像它),那么将它贴在自己的课堂上是完全可以的。所有模型都不需要关联控制器和视图,也不需要从ActiveRecord :: Base或任何其他ORM派生,也不需要与数据库有任何关系。
关于它是否属于lib或app / models - 我这样看:
如果它是您应用的一部分,则它属于app / models。如果它不是您的应用程序的一部分,如外部库,请不要将它放在app / models中 - 将它放在lib文件夹中。
答案 2 :(得分:1)
听起来你的解析器应该是一个实用程序类,而不是模型本身的一部分。可以这样想:模型应该包含应用程序完成其工作所需的所有逻辑。解析器的工作是将外部数据转换为逻辑可以处理的格式;它不是逻辑本身的一部分。
我将你的解析器保存在File之外,并将其放在lib /.
中答案 3 :(得分:0)
我用来让在models文件夹中实现与域相关的逻辑的类。您应该知道,如果在/ lib文件夹中,它们将不会被自动重新加载。