可能重复:
抽象VS信息隐藏VS封装
有人可以向我解释面向对象编程中封装和抽象原则之间的主要区别(如果可能的话,还有示例).
我正在阅读有关创建图形"抽象层"的信息,以便在图形平台之间切换.不幸的是,我无法找到关于这个主题的更多细节.这种抽象是否可以在功能级别上实现,具有类似的功能?
void pushMatrix(){
if (directx){
// do directx function
}else if (opengl){
// do opengl function
}
}
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?有没有更好的办法?有人能指出一些做这个或更多示例代码的事情的例子吗?
在.net中是否有ACL抽象层?我看过一些"最佳实践"文档,但没有很好的基础实现.那么System.Security.AccessControl呢?这是一个很好的起点吗?
ACL应该与存储在DB中的角色以及系统中的角色以及内存中对象定义以及数据库对象或文件一起使用.所以它应该是通用的和/或易于扩展.
这应该依赖于.net框架中的IPrincipal,IIdentity吗?
Zend在他们的PHP框架中有类似的东西,我正在为C#搜索这种东西,而不是移植它(如果已经有标准的解决方案或最佳实践实现).
@ladislav:
它不适用于Web服务,胖客户端或独立应用程序.因此,我正在搜索一个抽象层,可以通过适配器为特定的后端/平台进行扩展.你是对的,我正在为不同类型的对象和正确的定义搜索类似于基于角色的访问管理抽象层.这不应该依赖于您为文件系统中的文件夹设置的ACL.文件系统应该是ACL实现使用的特殊适配器.对我来说,ACL本身就是一个概念,与文件系统无关.文件系统使用ACL概念的实现(即使它在该领域中最为人所知).不希望硬依赖Win32-api.这就是为什么我要求通用(和广泛)使用的通用和抽象(接口)的东西.你知道zend框架中的实现(我知道它是PHP,但这个概念适用于任何应用程序,而不仅仅是基于Web的)?它是抽象的,可以用于代码中的任何对象
我正在编写一个 Active Directory 包装器,试图遵循 SOLID 和其他最佳实践。该接口当前是“IActiveDirectory”。
我现在遇到的问题是实现 ActiveDirectory 必须实现 IDisposable 来处理在这个包装器中创建和处理的一些资源,我不知道如何在尝试对接口进行编码时解决这个问题,等等。 . 我不想创建有漏洞的抽象(即用 IDisposable 装饰 IActiveDirectory。)由于底层依赖项的性能,我无法使服务细化(即将资源的创建/处置范围限定为方法调用)。
我目前有一个工厂,以便 IActiveDirectory 的消费者可以按需创建一个工厂,但我需要一种干净、方便的方式让消费者用信号通知资源已完成。
如何在不泄露资源包装器抽象的情况下为消费者提供合同(即接口)?我应该只公开没有接口的实现吗?我的消费者或我的 DI 容器是否有办法管理此服务的生命周期?
我是Ruby的新手.我正在学习ruby中的抽象原理.我理解过程抽象是隐藏用户的实现细节,或者只是专注于基本要素而忽略细节.
我关心的是如何实现它
1)这是一个简单的函数调用就像这样
# function to sort array
# @params array[Array] to be sort
def my_sort(array)
return array if array.size <= 1
swapped = false
while !swapped
swapped = false
0.upto(array.size-2) do |i|
if array[i] > array[i+1]
array[i], array[i+1] = array[i+1], array[i]
swapped = true
end
end
end
array
end
Run Code Online (Sandbox Code Playgroud)
并且这样打电话
sorted_array = my_sort([12,34,123,43,90,1])
Run Code Online (Sandbox Code Playgroud)
2)数据抽象与封装有何不同
据我所知,Data Abstraction只是隐藏了其他类的一些成员数据.
这是为了简化我在这里提出的问题的一部分:
我想写一些代码,保证在符合特定条件的类型上工作.我们今天要写一些代码:
immutable Example
whatever::ASCIIString
end
function step_one(x::Example)
length(x.whatever)
end
function step_two(x::Int64)
(x * 2.5)::Float64
end
function combine_two_steps{X}(x::X)
middle = step_one(x)
result = step_two(middle)
result
end
x = Example("Hi!")
combine_two_steps(x)
Run Code Online (Sandbox Code Playgroud)
运行此工作:
julia> x = Example("Hi!")
Example("Hi!")
julia> combine_two_steps(x)
7.5
Run Code Online (Sandbox Code Playgroud)
然后另一天我写了更多代码:
immutable TotallyDifferentExample
whatever::Bool
end
function step_one(x::TotallyDifferentExample)
if x.whatever
"Hurray"
else
"Boo"
end
end
function step_two(x::ASCIIString)
(Int64(Char(x[end])) * 1.5)::Float64
end
Run Code Online (Sandbox Code Playgroud)
你知道什么,我的通用组合功能仍然有效!
julia> y = TotallyDifferentExample(false)
TotallyDifferentExample(false)
julia> combine_two_steps(y)
166.5
Run Code Online (Sandbox Code Playgroud)
欢呼!但是,说这是一个深夜,我试图在第三个例子再次这样做.我记得要实施step_one,但我忘了实施step_two!
immutable ForgetfulExample
whatever::Float64
end
function …Run Code Online (Sandbox Code Playgroud) 使用ORM(对象关系映射器)是一个好主意,如:
适用于Android应用.
这种技术添加的抽象层本身就有计算和内存开销.因为,那些资源和电池寿命大多非常有限,我会认为"不",但另一方面它使代码更清晰,因为几乎从来不必编写原始查询.
我需要至少做一些努力从我的源代码中删除从未使用过的代码.一般的偏好是使用静态代码分析工具.我们在其他项目中运气很好,但我听到的人大多是从事设备级代码的C/C++开发人员.
我是一名从事Java EE系统的Web开发人员.最受青睐的分析工具是Coverity Prevent,尽管我可以提出一些其他的建议,如果我能够证明它更适合我们正在开发的技术.
我发现自己很可疑 - 当你在一个有很多抽象的系统上运行时,静态代码分析对死代码的有效性是什么?例如,我们使用Spring的依赖注入,以及JSF.在这两种情况下,都没有简单的方法来跟踪从前端到后端的函数调用,并完整地了解被调用的内容和不调用的内容.
我非常担心死代码检查中的误报将首先超过运行该工具的价值.
这种情况有什么经验?当您的架构使用了大量抽象时,您是否设法从静态代码分析工具中获取价值?你有什么必须做的才能让它以最少的误报工作吗?
我们即将启动一个类似于前一个项目的新项目.我可以复制旧设计,但我对旧设计并不十分满意.
它是一个"标准"业务系统(销售,盘点,仓储等),构建在.Net 3.5(Winforms MDI)的后端,后端有Entity Framework.
所有表单都继承自baseform(继承Windows.Form).该表单公开了一个名为ObjectContext的属性,该属性在第一次调用时实例化一个新的ObjectContext.我认为这构成了一个非常好的UnitOfWork,在每种形式中都隔离了所有数据访问.
然而.
我已经将所有查询和常见CRUD封装在"可怜的勒芒存储库"中.这些存储库作为ObjectContext的属性公开.
因此,如果我想绑定并命令表单,我将调用OrderLinesGrid = ObjectContext.OrderRepository.GetOrderLinesByID(orderID).
OrderRepository获取对为表单创建的objectcontext的引用,如下所示
(在我的部分ObjectContext类中)
Private _OrderRepository as OrderRepository
Public ReadOnly Property OrderRepository as OrderRepository
Get
if _orderrepository is nothing then
_orderrepository = New OrderRepository(me)
end if
return _orderrepository
End Get
End Property
Run Code Online (Sandbox Code Playgroud)
我不喜欢这个是:
对存储库的调用是通过ObjectContext进行的.因此,我没有得到查询和我想要的dataaccesslayer之间的抽象.
对于我的域中的每个新类型,我需要在ObjectContext中创建一个属性
我对OrderRepository的调用应该只返回域对象,而不用担心它是如何持久化的.此外,我不能让每个存储库拥有它自己的ObjectContext,因为这需要我在引用时附加和分离对象,即Country到Order.Country属性.
我很感激有关此设计的任何想法和反馈:)
abstraction entity-framework unit-of-work repository-pattern winforms
我收集在Objective-C中我必须将实例变量声明为我的类的接口的一部分,即使这些变量是实现细节并具有私有访问权限.
在"主观"C中,我可以在我的.c文件中声明一个变量,它在该编译单元之外是不可见的.我可以在相应的.h文件中声明它,然后在该编译单元中链接的任何人都可以看到该变量.
我想知道在Objective-C中是否有相同的选择,或者我是否必须在.h中为我的班级声明每个ivar.
阿里.
abstraction ×10
c# ×2
oop ×2
.net ×1
acl ×1
android ×1
database ×1
dependencies ×1
directx ×1
generics ×1
interface ×1
jsf ×1
julia ×1
objective-c ×1
opengl ×1
opengl-es ×1
orm ×1
performance ×1
ruby ×1
spring ×1
traits ×1
unit-of-work ×1
winforms ×1