gpt4 book ai didi

model-view-controller - 是或否:MVC中的模型是否应包含应用程序逻辑?

转载 作者:行者123 更新时间:2023-12-03 09:18:20 25 4
gpt4 key购买 nike

昨天,我与一位开发人员就MVC进行了一些讨论,更确切地说是关于模型组件在MVC中的作用。

我认为,模型应仅包含属性,而几乎不包含功能,因此模型类中的方法应尽可能少。

我的同事虽然相信模型可以而且应该具有更多的功能,并提供更多的功能。

这是我们争论过的一个例子。

示例1

假设我们要创建一个博客。博客包含文章和标签。每个文章可以具有多个标签,每个标签可以属于多个文章。所以我们在这里有一个m: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获取后端数据应该是 Controller 的工作,它使用专用类使用解析器处理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打破了这种方法,因为到最后,所有模型都将充满执行各种时髦任务的方法,而 Controller 和助手类几乎什么也不做。

在我对MVC的理解中,模型应该只包含属性和最少的“帮助方法”。例如,模型“Article”可以提供方法getNumOfTags(),但它不应自行进行任何Ajax调用。

那么,哪种方法正确呢?

最佳答案

通常,我也会尽量简化逻辑 Controller 。如果需要业务逻辑,它将上升到“服务层”类进行处理。这也节省了重复任何代码/逻辑的时间,如果业务逻辑要更改,最终使整个项目的可维护性更高。我只是将模型纯粹保留为实体对象。

我认为上面的答案很好地总结了这一点,但很容易根据设计模式对项目进行过度设计:选择对您有用且最可维护/最有效的方法。

关于model-view-controller - 是或否:MVC中的模型是否应包含应用程序逻辑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13951445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com