在面向对象的编程中,自定义类(如具有Name数据的Person类,地址列表等)保存数据,也可以包含集合对象。数据结构也用于保存数据。那么,概念上是一类被认为是先进的数据结构吗?在高效系统的设计中(在面向对象的世界和大型系统中),被认为类似于数据结构的类和为高效类设计进行的算法分析以提高效率(在google,facebook等公司)?
答案 0 :(得分:23)
我建议你阅读Clean Code第6章:对象和数据结构。整章都是关于这个......如果你不想买这本书,你可以阅读摘要,可以找到here。
据此,您可以通过两种不同的方式有效地使用课程。这种现象称为数据/对象反对称。根据您的目标,您必须决定您的课程是否会遵循open/closed principle 如果他们遵循OCP,他们将是多态的,他们的实例将被用作对象。因此,它们将隐藏数据和公共接口的实现,并且很容易添加实现该接口的新类型。大多数设计模式都符合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,因为重复相同的if-else语句不够干。
我不建议你使用部分完成,部分违反OCP的混合类,因为这样代码将很难维护。您应该根据您遵循的方法决定每种情况。这应该是一个简单的决定,但如果你犯了一个错误,你仍然可以在以后重构你的代码......
答案 1 :(得分:7)
我会说概念一个类是 NOT 一个数据结构,一个类代表好,一类对象,而对象是抽象的(在英文意思是这个词,而不是C ++或C#含义的实体。
我认为类和对象就像实践背后的理论,实践是使用方法和数据实现对象。数据可能简单或复杂(即所谓的高级数据结构)。
答案 2 :(得分:7)
自定义类是否是数据结构取决于您询问的对象。至少,肯定的人会承认,而不是用户定义的数据结构,这种数据结构比数据结构(例如数组,链表或二叉树)更具域特性且不太成熟。对于这个答案,我认为它们是截然不同的。
虽然很容易将Big O算法分析应用于数据结构,但是它对于类来说有点复杂,因为它们包含了许多这些结构,以及其他类的其他实例......但是对类实例进行了大量操作可以分解为数据结构上的原始操作,并用Big O表示。作为程序员,您可以通过避免不必要的成员复制并确保方法调用不会经历太多层来努力使您的类更高效。当然,在您的方法中使用高性能算法不言而喻,但这不是特定于OOP的。但是,除非必要,否则不应牺牲功能,设计和清晰度以支持性能。而过早的优化是魔鬼亚达亚达亚达。
我确信某些学者在某个地方试图制定量化课堂表现的指标,甚至是课程及其操作的微积分,但我还没有想到。然而,存在像this这样的QA研究,它测量项目中类之间的依赖关系......人们可能会认为依赖项的数量与方法调用的分层之间存在关联(因此降低了类性能)。但是如果有人研究过这个问题,我相信你可以找到一个更加相关的指标,不需要进行彻底的推论。
答案 3 :(得分:4)
类只是可以对该数据起作用的数据和方法的集合。您可以使用类来实现数据结构,但它们是不同的东西。
以链接列表为例。您可以使用类实现链接列表数据结构,在某些语言中,这是最干净,最明显的方法。它不是实现链接列表的唯一方法,但它可能是最好的,具体取决于语言。
然而,链接列表与成为一个类无关。相反,链接列表是一种将数据表示为单独节点的方式,其中每个节点以某种方式链接到下一个节点。
数据结构是数据建模的概念方式,每种不同的数据结构具有不同的属性和用例。类是一些语言提供的语法方式,用于分组数据和方法。
类经常用于实现数据结构,但是说class ==数据结构是不正确的。
答案 4 :(得分:1)
类描述模型/概念/类型并定义可能的行为和可能的状态(在您的示例中,Person
可以具有名称,地址等。
数据结构是某种类型,可用于以某种方式组织和分组数据。例如,向量和链表是可用于以有序方式存储数据的数据结构。
您可以拥有一个表示数据结构的类,例如C ++中的std::vector
或Java中的java.util.ArrayList
。
答案 5 :(得分:0)
简单地说,类可被视为由给定编程语言(例如Java)提供的语法工具,它将数据和方法捆绑在一起,用于实现程序中的概念或对象或申请。
使用类,您可以实现一个软件组件,它代表现实世界中的想法或对象。您可以通过将对象的属性捕获为成员变量及其行为或操作作为类的方法来实现此目的。
另一方面,数据结构基本上是处理数据的模型(数组,链表,二进制搜索树)。 Class通常用于实现数据结构,因为它们以独特的方式捕获这些结构的状态和行为。
因此,这两者在这个意义上是截然不同的。