【问题标题】:Single responsibility principle in ViewModelViewModel 中的单一职责原则
【发布时间】:2013-03-16 12:29:21
【问题描述】:

我正在编写图形编辑器(图论)。假设顶点需要这些属性:

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.

对吗?

但是对于顶点的ViewModel需要,所有这些属性都要显示出来。

class VertexVM
{
Vertex _v;
Positions _positions;
//...
Point position
{
     get {return _positions.getPosition(_v); }
}

// same for color etc

}

是否违反 SRP? (在我看来,是的。)有什么办法可以避免它?谢谢。

【问题讨论】:

  • 我一直在为此苦苦挣扎。我个人首选的方法(也不是唯一的方法)是为我的复杂视图模型使用部分类。
  • SRP 并不意味着您应该拥有只包含单个属性的类...
  • @walther 是的,我知道......它是由改变的原因定义的。但我绝对可以说出改变这个类的两个原因(例如,Position 2D -> 3D,Color RGB -> HSL)
  • 也许试着找出“改变的理由”实际上是什么意思:) 你仍然在修改一个类的属性,这是一个单一的原因。如果 SRP 的意思与您认为的一样,那么您将只有一个属性类。在设计课程时使用常识,否则您以后将面临许多问题。原则不是法律,它们是指导方针,应该这样对待。
  • @walther :我仍然认为管理颜色(可能至少有五个转换方法)和位置(我也可以想象至少对于方法)的类违反了 SRP。我知道这没什么大不了的,如果我这样写,也不会是世界末日。我实际上需要我论文的一个理论部分的答案。

标签: mvvm viewmodel single-responsibility-principle


【解决方案1】:

我会说您的初始顶点定义违反了 SRP,但不是因为您似乎通过重构暗示的原因。另一方面,您的 VertexVM 违反了 SRP。

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

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

【讨论】:

  • 我很确定,那个顶点不是由它的位置定义的。我知道很多不涉及顶点位置的图论问题(邻接矩阵是有效图)。
  • 不幸的是,当 VertexVM 向 Positions(模型层)询问其位置时,我看不到任何违反 SRP 的行为。如果我错了,请纠正我。谢谢。
  • 如果您使用 Vertex 来指代 2D 平面中的顶点,其中颜色对模型中的顶点有意义,而不仅仅是它的显示方式,那么我相信原始顶点定义就足够了.但是,如果您稍后希望允许它位于 3D 平面中或具有数字值而不是颜色,那么将其更改为直接支持这两者将违反 SRP。我仍然相信所有顶点的位置知识违反了 VertexVM 的 SRP。
  • 好的,我现在明白了。我只是想解释一下,该位置不是任何特殊属性。 DFS alg - 没有颜色,没有位置;着色 alg - 没有位置,只有颜色; Kruskal alg - 没有颜色,只有位置 我同意 VertexVM 引用 Positions (它保存所有顶点的位置)很奇怪,但它只能访问其模型顶点的值(VertexVM 不知道,还有其他一些顶点)。非常感谢。我整理了一下思路。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-16
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多