昨天我与我们的一位开发人员就 MVC 进行了一些讨论,更准确地说是关于模型组件在 MVC 中的作用。
在我看来,模型应该只包含属性而几乎没有功能,因此模型类中的方法尽可能少。
我的同事虽然认为模型可以而且应该具有更多功能并提供更多功能。
这是我们争论的一个例子。
示例 1
假设我们想创建一个博客。博客有文章和标签。每篇文章可以有多个标签,每个标签可以属于多篇文章。所以我们在这里有 am:n 关系。
在伪代码中,它可能看起来像这样:
class Article{
public int id;
public String title;
public String content;
public Tag[] tags;
// Constructor
public void Article(id, title, content, tags){
this.id = id;
this.title = title;
this.content = content;
this.tags = tags;
}
}
class Tag{
public int id;
public String name;
// Constructor
public Tag(id, name){
this.id = id;
this.name = name;
}
}
现在,假设我们在这里工作的是松散耦合,这意味着我们可能有一个没有标签的 Article 实例,所以我们将使用 Ajax 调用(对我们的后端有一个包含所有信息的数据库)获取属于我们文章的标签。
棘手的部分来了。我相信通过 Ajax+JSON 获取后端数据应该是控制器的工作,它使用一个专用类来处理使用解析器的 ajax 请求:
class MyController{
private void whatever(articleID){
Article article = (Article) ContentParser.get(articleID, ContentType.ARTICLE);
doSomethingWith(article);
}
}
public abstract class ContentParser{
public static Object get(int id, ContentType type){
String json = AjaxUtil.getContent(id, type.toString()); // Asks the backend to get the article via JSON
Article article = json2Article(json);
// Just in case
Tag[] tags = article.tags;
if (tags == null || tags.length <= 0){
json = AjaxUtil.getContent(article.id, ContentType.TAGS); // Gets all tags for this article from backend via ajax
tags = json2Tags(json);
article.tags = tags;
}
return article;
}
// Does funky magic and parses the JSON string. Then creates a new instance of Article
public static Article json2Article(String json){
/*
...
*/
return new Article(id, title, content, tags);
}
// Does funky magic and parses the JSON string. Then creates a new instance of Tag
public static Tag[] json2Tags(String json){
/*
...
*/
return tags;
}
}
示例 2
我的同事认为这与 MVC 的想法不同,他建议模型应该注意这一点:
class Blog{
public int id;
public String title;
public Article[] articles;
// Constructor
public Blog(id, title, articles){
this.id = id;
this.title = title;
this.articles = articles;
}
public void getArticles(){
if (articles == null || articles.length <= 0){
String json = AjaxUtil.getContent(id, ContentType.ARTICLE); // Gets all articles for this blog from backend via ajax
articles = json2Articles(json);
}
return articles;
}
private Article[] json2Articles(String json){
/*
...
*/
return articles;
}
}
class Article{
public int id;
public String title;
public String content;
public Tag[] tags;
// Constructor
public Article(id, title, content, tags){
this.title = title;
this.content = content;
this.tags = tags;
}
public Tag[] getTags(){
if (tags == null || tags.length <= 0){
String json = AjaxUtil.getContent(id, ContentType.TAGS); // Gets all tags for this article from backend via ajax
tags = json2Tags;
}
return tags;
}
// Does funky magic and parses the JSON string. Then creates a new instance of Tag
private Tag[] json2Tags(String json){
/*
...
*/
return tags;
}
}
在你要做的模型之外:blog.getArticles();
或者article.getTags();
在不打扰 ajax 调用的情况下获取标签。
然而,尽管这可能很方便,但我相信这种方法与 MVC 不同,因为到最后,所有模型都将充满各种方法,这些方法可以做各种时髦的事情,而控制器和辅助类几乎什么都不做。
在我对 MVC 的理解中,模型应该只包含属性和内部最少的“辅助方法”。例如,模型“Article”可以提供方法 getNumOfTags(),但它不应该自己进行任何 Ajax 调用。
那么,哪种方法是正确的呢?