Naming conventions 有关视图模型的命名约定,以避免长名称

Naming conventions 有关视图模型的命名约定,以避免长名称,naming-conventions,viewmodel,code-organization,Naming Conventions,Viewmodel,Code Organization,我正在为ASP.NET MVC应用程序中的每个屏幕创建视图模型。我将创建视图模型的所有逻辑都放在生成器类中。通常,有特殊的逻辑将数据对象转换为视图模型,包括聚合、过滤和排序。每个构建器都会被传递一个依赖项集,它是一个包含每个依赖项(存储库、其他构建器等)属性的对象 问题是我的名字越来越长了。依赖项集的名称通常由以下方式组成: 视图模型名称+生成器+依赖项集 视图模型的名称通常由当前位置和子对象组成。例如,我的系统对提供者定义进行了分类。因此,为了显示类别下的提供者定义,我有一个视图模型,名为:

我正在为ASP.NET MVC应用程序中的每个屏幕创建视图模型。我将创建视图模型的所有逻辑都放在生成器类中。通常,有特殊的逻辑将数据对象转换为视图模型,包括聚合、过滤和排序。每个构建器都会被传递一个依赖项集,它是一个包含每个依赖项(存储库、其他构建器等)属性的对象

问题是我的名字越来越长了。依赖项集的名称通常由以下方式组成:

视图模型名称+生成器+依赖项集

视图模型的名称通常由当前位置和子对象组成。例如,我的系统对提供者定义进行了分类。因此,为了显示类别下的提供者定义,我有一个视图模型,名为:

类别ProviderDefinitionListViewModel

它看起来像这样:

public sealed class CategoryProviderDefinitionListViewModel
{
    public long CategoryId { get; set; }
    public string CategoryName { get; set; }
    public ProviderDefinitionViewModel[] ProviderDefinitions { get; set; }
}
因此,我的构建者被称为

类别ProviderDefinitionListViewModelBuilder

因此,我的依赖集被称为

类别ProviderDefinitionListViewModelBuilderDependencySet

这几乎不适合整个屏幕。我可怜的手指累了。此外,一些屏幕几乎显示相同的数据,因此它们的视图模型名称几乎相同。当我浏览文件夹时,很难找到我要查找的特定视图模型类

理想情况下,我可以将视图模型类分组在一起,将它们与使用它们的视图相关联。避免冲突并使名称尽可能短,同时保持它们的意义,这将是一件好事。是否有人发现命名约定/文件夹组织在这种情况下运行良好?

我已经持续使用“ViewModel”后缀有一段时间了,老实说,有时我觉得它是多余的。我认为将所有这些类分组到不同的名称空间就足够了

我的理解是,采用此约定是为了避免域模型和视图模型类之间的冲突(例如ProductvsProductViewModel)。但是,由于视图模型是以屏幕命名的,因此域模型中不太可能有同名的类。事实上,为什么在域模型中有这样一个类,这应该是值得怀疑的

因此,如果将视图模型命名为ViewProduct(以允许用户查看/编辑产品),则无需将其命名为ViewProductViewModel。看到我要去哪里了吗

因此,您的生成器类可以简单地称为ViewProductBuilder,而不是ViewProductViewModelBuilder

关于你的依赖集,我不确定你的理由是什么。但对我来说,这似乎没有必要。如果构建器对其他对象有依赖关系,则需要将依赖关系注入到构建器的构造函数中,而不是将它们封装到另一个类(DependencySet)中,然后传递它们

如果您发现您的构建器依赖于太多的东西,而这正是您试图隐藏在DependencySet后面的东西,那么它可能是其他地方设计气味的指示。如果类及其依赖项是以适当的面向对象方式设计的,那么行为应该在不同的类之间很好地分布,并且任何类都不应该依赖太多的其他东西。因此,将这些N个依赖项隐藏在1个类(DependencySet)下只是治标不治本


希望有帮助:)

我更喜欢用“DTO”来修复我的ViewModel名称。(其中DTO代表数据传输对象,即只包含信息的对象)


这不仅是为了避免长名称。但它也使我能够使用与User相同的名称,但它将被称为UserDTO,这表明我正在使用的对象是ViewModel的一部分,从而避免命名冲突。

我倾向于同意Mosh

ViewModel后缀在大多数情况下都是多余的,虽然有时您可能会有匹配的类名,但管理起来非常容易,因为它们仅限于ViewModel命名空间。我还发现,使用奇怪的名称空间别名对我的大脑的伤害要比在所有的类名后面加后缀要小

当然,在presenter/controller中,您可能会遇到命名冲突,但这可能表明您需要更恰当地命名视图,例如,不是User,而是ViewUser/EditUser


对于搜索结果和列表,我发现最好将诸如IEnumerable之类的内容替换为IEnumerable。后者通常意味着您最终将得到一个用户视图模型类,该类将成为整个项目中可能需要或不需要的所有用户属性的转储场。这是一件需要注意的大事,如果你发现自己上了这样的课,你就已经偏离了轨道。保持视图和视图模型的描述性和特定性。如果您有许多类似的视图模型,那么问题可能是一个更大的设计问题;一些设计师倾向于重新设计而不是重用现有的图形结构。

a首先,在同一个解决方案中,DTO和视图模型是可能的。这是真的。如果出现这种情况,我可能也会选择不同的命名约定。但这一点很好。