当他们希望跳过官方界面并直接访问底层实现细节时,我有时会遇到其他希望解决问题的人的困难.
他们认为,这样做可以让他们更快地解决问题.我认为这样做会导致我们的架构变得更加紧密,并且随着新需求的出现而难以改变.
我指出了当前设计的所有工作,设计理念和灵活性的价值,尝试维护和更改脆弱代码的成本,封装和数据隐藏以及分层架构的价值以及稳健性规范中的微小变化会导致代码的微小变化.他们说"但这会更容易."
你是如何处理这些人的?
>> a = 5
=> 5
>> b = "hello, world!"
=> "hello, world!"
>> b.dup
=> "hello, world!"
>> a.dup
TypeError: can't dup Fixnum
from (irb):4:in `dup'
from (irb):4
Run Code Online (Sandbox Code Playgroud)
我知道Ruby会在每次为新变量赋值时制作副本,但为什么会Numeric#dup引发错误?
这不会打破抽象,因为所有对象都应该被.dup正确地响应吗?
dup据我所知,重写方法将解决问题:
>> class Numeric
>> def dup()
>> self
>> end
>> end
Run Code Online (Sandbox Code Playgroud)
这有没有我看不到的缺点?为什么不将它内置到Ruby中?
我是一个对面向对象概念有很好理解的java开发人员(或者,我想是这样的).现在我正在学习设计模式(From Head first design patterns).我一直在阅读有关OOPS概念抽象的内容,以便简单地理解它,并且阅读更多有关它的信息让我比以前更加困惑.
据我所知,抽象是指隐藏程序的内部细节,同时将接口暴露给其他程序员,而不必担心内部细节.但是,我不明白
如果我在任何地方都错了,请纠正我.
目前,我尝试编写一个小游戏程序(Skat)作为业余爱好项目.斯卡特是一个招人游戏,两名球员对阵一名球员.由于有不同类型的玩家(lokal播放器,网络播放器,计算机等),我想将界面抽象给玩家.
我的基本想法是使用一个类型类Player,它定义了所有类型的东西,一个玩家必须做和知道(玩牌,获得通知谁赢得了这个技巧等).然后,整场比赛仅通过一个函数来完成playSkat :: (Player a, Player b, Player c) => a -> b -> c -> IO (),其中a,b并且c可能是不同类型的球员.然后,玩家可以以实现定义的方式做出反应.lokal播放器会在终端上收到一些消息,网络播放器可能会通过网络发送一些信息,而计算机播放器可能会计算出新策略.
因为玩家可能想要做一些IO并且肯定想要某种状态来跟踪私人事物,所以它必须存在于某种Monad中.所以我Player想要像这样定义类:
class Player p where
playCard :: [Card] -> p -> IO (Card,p)
notifyFoo :: Event -> p -> IO p
...
Run Code Online (Sandbox Code Playgroud)
这种模式似乎与状态变换器非常相似,但我不知道如何处理它.如果我把它作为额外的monad-transformer写在IO之上,那么我在一天结束时会有三个不同的monad.我怎样才能以良好的方式编写这个抽象?
为了澄清,我需要的是,通常的控制流程应该是这样的:
当玩一个技巧时,第一个玩家打牌,然后是第二个,最后是第三个.为此,逻辑需要playCard为每个玩家执行函数trice.之后,逻辑决定哪个玩家赢得了技巧并将赢得的信息发送给所有玩家.
作为一名初学程序员,刚刚学习了OOP的基础知识,我遇到了很多关于我的练习程序的基本包含结构的问题.我一直在教自己使用各种书面和在线资源进行编程.但是,这是我的问题(好吧,其中一个......):
一方面,我理解抽象,封装和类之间的低度耦合的重要性,但另一方面,我一直在努力构建我的程序并以允许不同的方式设计我的类在不同的文件中的类来了解彼此.
当然,这是我的一个主要问题,导致草率,hackish代码只能按照我想要的方式工作,我将每个基本的主要OOP抛出窗口并开始用全局变量填充我的代码,向前声明一切到处都是,让班级成员公开.
简单地说:我的编程很乱...... C++是我的第一个编程语言,即使我尽力以面向对象的方式设计/编写,我最终会得到一个丑陋的文件,#包括几乎所有的东西每个文件,以及很少有效的程序和OOP意大利面条代码的奇怪组合!
我是一个自称编程的新手,我接受学习如何构建一个程序需要时间,但我几乎要结束了!我知道我的问题源于我对OOP 有点了解的事实.我知道我想编写处理单个任务的独立类.但与此同时,我不明白如何正确地提醒每个类的程序其他部分的存在.这有点像知道你应该吃什么类型的食物,但不知道如何使用叉...
简而言之,这是我的问题.并进一步跟进我提出的一些更具体的问题:
在C++多文件项目中,将main()函数放在自己的类中是正常/需要的吗?或者将main()留在全局范围内是标准的事情吗?
在之前的程序性程序中,我用C++编写,在main.cpp文件的顶部,在全局作用域中有一个常量变量或#defines并不罕见.例如,可能在程序开始时定义屏幕的尺寸或其他有用信息.OOP会发生什么?是否完全避免了这种做法?或者我是否在项目的每个其他标题中创建MAIN.H文件并将其包含在内?我不知道该怎么办......
在编写我的第一个中等规模的练习OOP程序时,当我开始尝试编写StateMachine类时,我的工作开始戛然而止.我打算让StateMachine类包含程序将使用的所有可能的屏幕状态.但是,出现了一个问题,即我的StateMachine类似乎不知道我的其他一些State类,即使它们都是#included.我见过人们之前做过类的前进声明,是否有必要?我应该在整个地方垃圾邮件发送类的前向声明,还是代码味道?
最后,#include和forward声明命令的顺序是否重要?
我知道这可能是一个超级基本的问题,但是在我从单文件程序c ++初学者程序到多文件OOP编程的过渡中,这给我带来了很大的困难.是否有一些一般的经验法则来构建你的程序,以便一切正常?我一直在使用包含警卫,所以有什么理由不能只在每个源文件中包含#include每个头文件?我应该在每个类的每个头文件中都有#included的common.h文件吗?
我非常感谢社区给予我的任何帮助/建议.我知道在我开始发展我的OOP技能之前,这是一个简单而重要的障碍.我一直试图深入了解保持课程彼此分离的重要性,以至于我不确定如何以一种允许他们真正互相交流的方式真正设置我的课程/文件!非常感谢你的帮助!
我有一个我想尝试与dto联系的枚举:
public enum DtoSelection
{
dto1,
dto2,
dto3,
}
Run Code Online (Sandbox Code Playgroud)
此枚举中有108个和值.
我为这些dto中的每一个都有一个dto对象:
public class dto1 : AbstractDto
{
public int Id { get; set; }
//some stuff specific to this dto
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试创建一个方法(最终是一个服务),它将返回一个与所讨论的dto相关联的类型的新dto对象:
private AbstractDto(int id)
{
if (id == DtoSelection.Dto1.ToInt()) //extension method I wrote for enums
return new Dto1();
if (id == DtoSelection.Dto2.ToInt())
return new Dto2();
}
Run Code Online (Sandbox Code Playgroud)
显然我不想这样做108次.无论出于何种原因,我的大脑只是遗漏了一些明显 处理这个问题的最佳方法是什么.
在Thoughtworks技术雷达上 - 他们将Java Server Faces 搁置- 说明:
我们继续看到团队使用JSF - JavaServer Faces遇到麻烦 - 并且建议您避免使用这种技术.团队似乎选择JSF,因为它是一个J2EE标准,而没有真正评估编程模型是否适合它们.我们认为JSF存在缺陷,因为它试图抽象出HTML,CSS和HTTP,正好与现代Web框架相反.与ASP.NET webforms一样,JSF尝试在无状态协议HTTP之上创建有状态,最终导致涉及共享服务器端状态的大量问题.我们知道JSF 2.0的改进,但认为该模型从根本上被打破.我们建议团队使用简单的框架,拥抱和理解Web技术,包括HTTP,HTML和CSS.
据我所知,如果你用无状态抽象包装像http的无状态协议,他们基本上会说你可能会陷入陷阱.也就是说,一个团队可能会遇到麻烦.
我的问题是:是否有证据表明Thoughtworks断言JSF是一个破碎的抽象?
我正在学习一些有关Java语言的教程.我想知道每次编写代码时,是否应该抽象,以及任何类型的标准和堆栈?
我已经看到,例如,对于每个Spring Services,我们甚至可以使用JavaEE堆栈上的EJB接口来抽象控制器.
我想知道那是什么目的?在使用Android SDK进行开发时,我应该做同样的事情吗?
我应该抽象我编码的每个类吗?
可能重复:
抽象VS信息隐藏VS封装
有人可以向我解释面向对象编程中封装和抽象原则之间的主要区别(如果可能的话,还有示例).
我正在阅读有关创建图形"抽象层"的信息,以便在图形平台之间切换.不幸的是,我无法找到关于这个主题的更多细节.这种抽象是否可以在功能级别上实现,具有类似的功能?
void pushMatrix(){
if (directx){
// do directx function
}else if (opengl){
// do opengl function
}
}
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?有没有更好的办法?有人能指出一些做这个或更多示例代码的事情的例子吗?