标签: design-principles

Const引用字段作为C++类中的readonly属性

在C++类中使用const引用字段作为只读getter是否合适?

我的意思是,这段代码是否符合良好做法?

class check{
private:
    int _x;
public:
    const int& x = _x;
    void setX(int v){
        _x = v;
    }
};
Run Code Online (Sandbox Code Playgroud)

它非常像C#属性,恕我直言,并且在类使用代码中非常简单和干净:

  check s;
  int i;
  std::cin >> i;
  s.setX(i);
  std::cout << s.x << '\n';
  s.setX(7);
  // s.x = i; // Error
  std::cout<<s.x<<'\n';
Run Code Online (Sandbox Code Playgroud)

c++ oop properties reference design-principles

16
推荐指数
2
解决办法
1869
查看次数

从儿童视图模型修改父母可观察的淘汰模式

我有一个父子视图模型对象结构设置,需要更新子项中父项的observable.我基本上提出了两种模式:

1]将父属性的引用传递给子级并从子级内更新属性:

var ParentViewModel = function(){
    var self = this;
    this.selectedItem = ko.observable();
    this.child = ko.observable(new ChildViewModel(self.selectedItem));
}

var ChildViewModel = function(parentSelectedItem){
    var self = this;
    this.id = ko.observable();
    this.parentSelectedItem = parentSelectedItem;
    this.select = function(){
        self.parentSelectedItem(self);
    }
}
Run Code Online (Sandbox Code Playgroud)

2]在父项上创建子项的select方法,并在本地引用父项observable:

var ParentViewModel = function(){
    var self = this;
    this.selectedItem = ko.observable();

    var child = new ChildViewModel();
    child.select = function(){
        self.selectedItem(child);
    }
    this.child = ko.observable(child);
}

var ChildViewModel = function(){
    this.id = ko.observable();
}
Run Code Online (Sandbox Code Playgroud)

这些模式都没有让我头疼.第一个将整个属性引用推送到子视图模型中,第二个将子函数定义在子范围之外.

有没有人有任何其他模式的建议,如何在javascript中以干净和可测试的方式实现此操作?或者我或多或少地坚持这两个选项?

javascript design-patterns design-principles knockout.js

14
推荐指数
1
解决办法
6954
查看次数

一种非常常见的C#模式,打破了一个非常基本的OOP原则

这是一个非常简单的问题,我仍然非常不安:

为什么现在广泛接受类通过访问器方法返回对其私有成员的引用?这不完全打破封装原则吗?如果这样可以,那为什么不公开会员!?

public class EncapsulationViolator
{
  private object abuseMe;

  public object AbuseMe 
  {
    get { return abuseMe; }
  }
}
Run Code Online (Sandbox Code Playgroud)

编辑我正在考虑的案例就是这个

EncapsulationViolator ev = new EncapsulationViolator();

object o = ev.AbuseMe;

o.SetValue(newValue);
Run Code Online (Sandbox Code Playgroud)

现在,ev的状态已经通过传递性而发生变化,因为其成员滥用状态已发生变化.

在DDD的上下文中,如果对象是聚合根,则不行.我引用

允许外部对象仅保留对根的引用.可以传递对内部成员的瞬时引用,以便仅在单个操作中使用.因为根控制访问权限,所以不能通过对内部的更改来愚蠢.

[ 领域驱动设计,Eric Evans]

... setters schmetters ......

c# oop encapsulation design-principles solid-principles

14
推荐指数
3
解决办法
2008
查看次数

Scala的模式匹配是否违反了开放/封闭原则?

如果我添加一个新的案例类,这是否意味着我需要搜索所有模式匹配代码并找出新类需要处理的位置?我最近一直在学习这门语言,当我读到一些支持和反对模式匹配的论据时,我一直很困惑它应该在哪里使用.请参阅以下内容:

Pro: Odersky1Odersky2

骗局: Beust

在每种情况下,评论都非常好.模式匹配是令人兴奋的东西还是我应该避免使用的东西?实际上,我认为答案是"这取决于你何时使用它",但它有哪些积极的用例和什么是负面用例?

oop scala pattern-matching design-principles

13
推荐指数
2
解决办法
2141
查看次数

软件的设计应考虑到性能吗?

在考虑性能的情况下,是否建议零件设计软件的组件或体系结构?我的意思是,设计/架构应该在性能密集型环境中使用的准备程度如何?

在设计组件时,我们应该遵循良好的OO原则,并确保组件是"可扩展的".这样我们在这里稍微调整一下设计,并在我们遇到性能问题时稍微调整一下.虽然这样,我们经常会遇到性能问题,在这些问题上调整软件可能会有所帮助.

或者,如果我们想出一个设计,虽然很复杂,但会使性能问题变得轻而易举.我们仍然需要调整软件,但调整通常非常简单,因为设计是面向性能的.

注意:在上面列出的两种情况中,我都试图在遇到性能问题之前调整软件的性能.要重新说明问题,软件的设计是否应该以性能为导向?

请不要回答我说这一切都取决于预期软件运行的环境.原因是任何工业级软件的客户似乎总是想要越来越多.您可能不会将您的软件计划为在性能密集型环境中持续运行,但如果必须,该怎么办?我们应该在感觉到时重新设计软件吗?

一个星期以来我一直困扰着这个问题,我还没有答案.你对此有什么看法?

language-agnostic oop design-principles

13
推荐指数
3
解决办法
953
查看次数

C的SOLID原则实现

我知道SOLID原则是针对面向对象语言编写的.

我在书中找到了罗伯特·马丁的"嵌入式C的测试驱动开发",本书最后一章的后续句子:

"应用开放封闭原则和Liskov替代原则可以实现更灵活的设计."

由于这是一本C(无c ++或c#)的书,应该有一种方法来实现这个原则.

在C中实现这个原则有什么标准方法吗?

c c++ design-principles solid-principles c++11

13
推荐指数
2
解决办法
4687
查看次数

Liskov替换原则是否适用于从抽象类继承的子类型?

松散地说,Liskov Substitution Principle声明派生类可以替代基类而不影响用户.在基类是抽象类的情况下,这意味着没有用户使用基类的实例,Liskov继承限制是否仍然适用于派生类?

oop liskov-substitution-principle design-principles

12
推荐指数
1
解决办法
1534
查看次数

添加更多行为而不创建新类

这是接受采访时提出的问题.

Label一个属性Text
在一个页面中标签很简单Label,在其他页面中它可以处理任何一个或以下动作的组合
Clickable
Resizable
Draggable

如何设计应用OOP设计原理和设计模式的标签组件?

我说我会创建以下内容:

public class Label
{
  public string Text{get;set;}
}
public interface IClickable
{
 void Click();
}

public interface IDraggable
{
 void Drag();
}
public interface IResizable
{
 void Resize();
}
Run Code Online (Sandbox Code Playgroud)

因此,如果客户想要Resizable Label

public class ResizableLabel:Label,IResizable
{
  ....
}
Run Code Online (Sandbox Code Playgroud)

同样的道理ClickableLable,DraggableLabel

但是,我觉得这是不正确的方法,因为我不想添加那些具体的类.我想避免ClickableAndDraggableLabelClickableDraggableResizableLabel.

是否有任何设计模式可以在不添加这些具体类的情况下解决此问题?

c# oop design-patterns design-principles

11
推荐指数
2
解决办法
1165
查看次数

设计模式和设计原则之间有什么区别?

我是Ruby on Rails的新手,我浏览了这些文章.

但我无法理解设计模式设计原则之间的实际区别.有人可以解释这个区别吗?

ruby design-patterns ruby-on-rails design-principles

11
推荐指数
3
解决办法
5417
查看次数

正确地实现两个具有不同类型但在语义上等效的对象的比较

我发现了类似的问题

如何比较具有相似属性的两个截然不同的对象

这可能含蓄地和/或部分地回答了我的问题.

假设我想要比较(没有很多嵌套条件)这个对象:

class ObjectA {
  public string PropertyX { get; set; }
  public char PropertyY { get; set; }
  public long PropertyZ { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

到了System.String.我只对平等不平等感兴趣(不是关于身份的一系列价值观).

实施IEquatable<string>ObjectA是一个正确的选择吗?我不关心什么只是简单的工作,我想确定这种情况的正确模式.

作为其他信息,请考虑ObjectA通常按顺序提供IEnumerable<ObjectA>.

我不需要知道是否"string" ==!= objectA实例; 不涉及排序.

编辑以澄清(和帮助)

对不起,写一个好问题有时很难......

假设我不能将其表示ObjectA为字符串以进行比较(违反封装不是一种选择).

  • 在上下文中,我要与之匹配PropertyY.

  • 在context-2中,我要将它与应用于PropertyY/ 的算法相匹配PropertyZ.

@Oliver解决方案在问题的最后再次帮助我(再次+1).我可以简单地定义一个自定义界面:

interface IContextConverter {
  string ToEquatableStringForContext1();
  string ToEquatableStringForContext2();  
}
Run Code Online (Sandbox Code Playgroud)

由于我也有一个 …

c# design-patterns design-principles

10
推荐指数
1
解决办法
6262
查看次数