Mvvm ViewModel中的单一责任原则

Mvvm ViewModel中的单一责任原则,mvvm,viewmodel,single-responsibility-principle,Mvvm,Viewmodel,Single Responsibility Principle,我正在编写一个图形编辑器(图论)。让我们想象一下顶点需要以下属性: class Vertex{ int ID {get;} Color color {get; set;} Point point{get; set;} } 但它违反了SRP(单一责任原则)。所以我创造了一些想法,比如: class Vertex{ int ID {get;} } class Positions{ private Dict<Vertex,Point> _pos; setPosition(Vertex

我正在编写一个图形编辑器(图论)。让我们想象一下顶点需要以下属性:

class Vertex{
int ID {get;}
Color color {get; set;}
Point point{get; set;}
}
但它违反了SRP(单一责任原则)。所以我创造了一些想法,比如:

class Vertex{
int ID {get;}
}

class Positions{
private Dict<Vertex,Point> _pos;

setPosition(Vertex v, Point pos);
Point getPosition(Vertex v);
}

//etc.

这是否违反了SRP?(依我看是的。)有什么办法可以避免吗?谢谢。

我想说,您最初的顶点定义违反了SRP,但这并不是您通过重新分解所暗示的原因。另一方面,您的VertexVM违反了SRP

图论中的顶点是图中的一个点或位置。根据定义,它应该负责知道它的位置。因此,它应该包含这一点。颜色是否属于它是另一种情况。我猜可能不是,因为这可能与显示更相关,不属于模型类。导致视图以特定颜色显示顶点的顶点类型可能是合适的


在VertexVM中,视图模型旨在表示视图的单个顶点。它不负责知道图中所有顶点的位置。这绝对违反了SRP。

我一直在努力解决这个问题。我个人喜欢的方法(也不是唯一的方法)是对我的复杂视图模型使用分部类。SRP并不意味着你应该有只包含一个属性的类…@walther是的,我知道。。。它是由改变的原因决定的。但是我可以明确地说出改变这个类的两个原因(比如位置2D->3D,颜色RGB->HSL),也许可以试着找出“改变的原因”到底意味着什么:)你仍然在修改一个类的属性,这只是一个原因。如果SRP的含义与您认为的相同,那么您只有一个属性类。在设计类时使用常识,否则以后您将面临许多问题。原则不是法律,它们是指导原则,应该这样对待。@walther:我仍然认为管理颜色(可能至少有五种转换方法)和位置(至少我可以想象方法也是如此)的类违反了SRP。我知道这没什么大不了的,也不会是世界末日,如果我这样写的话。实际上,我需要的是我论文理论部分的答案。我很确定,顶点不是由它的位置来定义的。我知道很多图论问题,它们不涉及顶点的位置(邻接矩阵是有效的图)。不幸的是,当VertexVM询问位置(模型层)的位置时,我看不到任何违反SRP的情况。如果我错了,请纠正我。谢谢。如果您使用顶点来指代二维平面中的顶点,其中颜色对模型中的顶点有意义,而不仅仅是它的显示方式,那么我相信原始顶点定义就足够了。但是,如果以后希望允许它位于三维平面中,或使用数字值而不是颜色,则将其更改为直接支持这两种颜色将违反SRP。我仍然相信所有顶点的位置知识,违反了VertexVM的SRP。好的,我现在明白了。我只是想解释一下,这个职位不是什么特殊的财产。DFS alg-无颜色,无位置;着色alg-无位置,仅颜色;Kruskal alg-没有颜色,只有位置我同意VertexVM引用位置(保存所有顶点的位置)很奇怪,但它只能访问其模型顶点的值(VertexVM不知道,还有一些其他顶点)。谢谢。我已经整理好了我的想法。
class VertexVM
{
Vertex _v;
Positions _positions;
//...
Point position
{
     get {return _positions.getPosition(_v); }
}

// same for color etc

}