在面向对象编程中,自定义类(如包含姓名、地址列表等数据的Person类)保存数据,也可以包含集合对象。数据结构也用来保存数据。那么,从概念上来说,一个类是否被认为是高级数据结构呢?在高效系统的设计中(在面向对象的世界和大型系统中),类是否被视为类似于数据结构和算法分析,以实现更高效率的高效类设计(在google、facebook等公司中)?
发布于 2010-11-22 14:16:38
自定义类是否是数据结构取决于您询问的是谁。至少,yes的人会承认它是一种用户定义的数据结构,它比数组、链表或二叉树等数据结构更特定于领域,建立得更少。对于这个答案,我认为它们是不同的。
虽然将Big O算法分析应用于数据结构很容易,但对于类来说就有点复杂了,因为它们包装了许多这些结构,以及其他类的其他实例……但类实例上的许多操作可以分解为数据结构上的原始操作,并用Big O表示。作为程序员,您可以通过避免不必要的成员复制并确保方法调用不会经过太多层来努力使您的类更有效。当然,在您的方法中使用性能算法是不言而喻的,但这不是OOP特定的。然而,除非必要,否则不应该为了性能而牺牲功能、设计和清晰度。而过早的优化是最可怕的yada yada。
我敢肯定,一些学者,在某些地方,试图制定一个量化班级表现的指标,甚至是班级及其操作的微积分,但我还没有遇到过。然而,存在像this这样的QA研究,它测量项目中类之间的依赖关系……有人可能会争辩说,依赖项的数量和方法调用的分层之间存在相关性(因此类性能较低)。但如果有人研究过这一点,我相信你可以找到一个更相关的指标,而不需要进行全面的推断。
发布于 2014-03-10 09:51:24
我推荐你阅读Clean Code第6章:对象和数据结构。整章都是关于这个的.如果你不想买这本书,你可以看摘要,它可以在here上找到。
根据这一点,您可以通过两种不同的方式有效地使用类。这种现象被称为数据/对象反对称。根据您的目标,您必须决定您的类是否遵循open/closed principle。
如果它们遵循OCP,它们将是多态的,并且它们的实例将用作对象。因此,它们将隐藏数据和公共接口的实现,并且很容易添加实现该接口的新类型。大多数设计模式都实现了对象访问控制协议,例如MVC、IoC、每个包装器、适配器等。
如果它们不遵循OCP,它们就不是多态的,它们的实例将被用作数据结构。因此,它们将公开数据,这些数据将由其他类操作。这也是过程编程的一种典型方法。有几个示例不使用OCP,例如DTO、异常、配置对象、visitor pattern等。
当您应该考虑实现OCP并将代码移动到较低抽象级别时的典型模式:
class Manipulator {
doSomething(Object dataStructure){
if (dataStructure instanceof MyType1){
// doSomething implementation 1
}
else if (dataStructure instanceof MyType2)
{
// doSomething implementation 2
}
// ...
},
domSomethingElse(Object dataStructure){
if (dataStructure instanceof MyType1){
// domSomethingElse implementation 1
}
else if (dataStructure instanceof MyType2)
{
// domSomethingElse implementation 2
}
// ...
}
}
class MyType1 {}
class MyType2 {}
//if you want to add a new type, every method of the Manipulator will change修复:将实现移动到较低的抽象级别,并满足OCP
interface MyType {
doSomething();
domSomethingElse();
}
class MyType1 implements MyType {
doSomething(){
// doSomething implementation 1
},
domSomethingElse(){
// domSomethingElse implementation 1
}
}
class MyType2 implements MyType {
doSomething(){
// doSomething implementation 2
},
domSomethingElse(){
// domSomethingElse implementation 2
}
}
// the recently added new type
class MyType3 implements MyType {
doSomething(){
// doSomething implementation 3
},
domSomethingElse(){
// domSomethingElse implementation 3
}
}当您应该考虑违反OCP并将代码移动到更高的抽象级别时的典型模式:
interface MyType {
doSomething();
domSomethingElse();
//if you want to add a new method here, every class which implements this interface, will be modified
}
class MyType1 implements MyType {
doSomething(){
// doSomething implementation 1
},
domSomethingElse(){
// domSomethingElse implementation 1
}
}
class MyType2 implements MyType {
doSomething(){
// doSomething implementation 2
},
domSomethingElse(){
// domSomethingElse implementation 2
}
}或
interface MyType {
doSomething();
domSomethingElse();
}
class MyType1 implements MyType {
doSomething(){
// doSomething implementation 1
},
domSomethingElse(){
// domSomethingElse implementation 1
}
}
class MyType2 implements MyType {
doSomething(){
// doSomething implementation 2
},
domSomethingElse(){
// domSomethingElse implementation 2
}
}
//adding a new type by which one or more of the methods are meaningless
class MyType3 implements MyType {
doSomething(){
throw new Exception("Not implemented, because it does not make any sense.");
},
domSomethingElse(){
// domSomethingElse implementation 3
}
}修复:将实现移动到更高的抽象级别,并违反OCP
class Manipulator {
doSomething(Object dataStructure){
if (dataStructure instanceof MyType1){
// doSomething implementation 1
}
else if (dataStructure instanceof MyType2)
{
// doSomething implementation 2
}
// ...
},
domSomethingElse(Object dataStructure){
if (dataStructure instanceof MyType1){
// domSomethingElse implementation 1
}
else if (dataStructure instanceof MyType2)
{
// domSomethingElse implementation 2
}
// ...
},
// the recently added new method
doAnotherThing(Object dataStructure){
if (dataStructure instanceof MyType1){
// doAnotherThing implementation 1
}
else if (dataStructure instanceof MyType2)
{
// doAnotherThing implementation 2
}
// ...
}
}
class MyType1 {}
class MyType2 {}或者将类拆分成子类。
人们通常遵循OCP而不是count one或two方法,因为重复相同的if-else语句是不够的。
我不建议你使用混合的类,因为这样代码将很难维护。你应该根据每种情况来决定你所遵循的方法。这通常应该是一个简单的决定,但是如果你犯了一个错误,你仍然可以在以后重构你的代码……
发布于 2010-11-22 13:55:30
我会说,从概念上讲,一个类是而不是一个数据结构,一个类很好地代表了一个对象的类,而对象是抽象的(在英语中这个词的含义,而不是这个词的C++或C#含义)实体。
我要说的是,类和对象就像实践背后的理论,而实践就是使用方法和数据实现对象。数据可以是简单的也可以是复杂的(所谓的高级数据结构)。
https://stackoverflow.com/questions/4242634
复制相似问题