面向对象的荒诞之处

问题描述

在常见的JavaWeb中,一般会有Modal,Controller,View,DAO,Service几个分层,而Modal在其中发挥怎样的贡献呢?莫非两点:1.对对象属性进行增、删、改时,作为新属性的包装,进行整体传递;2.对对象属性进行查询时对查出的数据进行包装以进行传递。然而实践中,我们在删、改、查时,通常只会涉及部分属性,并不经常动用全部属性。那么再用Modal来包装有什么意义呢?如果一个Modal有30个对象,而我通常操作只会涉及一两个字段,那么当我new一个对象时,内存中会分配所有字段的空间,而我只会使用其中一两个,在资源和效率上都产生极大浪费。那么这样面向对象又有什么意义呢?各位看官以为如何?

解决方案

解决方案二:

不要以点盖面,分析肯定是有好有坏的。
解决方案三:

我的看法就是你愚昧无知,没了解深入就在这里发放阙词。
解决方案四:

引用楼主someoneelse888的回复:

在常见的JavaWeb中,一般会有Modal,Controller,View,DAO,Service几个分层,而Modal在其中发挥怎样的贡献呢?莫非两点:1.对对象属性进行增、删、改时,作为新属性的包装,进行整体传递;2.对对象属性进行查询时对查出的数据进行包装以进行传递。然而实践中,我们在删、改、查时,通常只会涉及部分属性,并不经常动用全部属性。那么再用Modal来包装有什么意义呢?如果一个Modal有30个对象,而我通常操作只会涉及一两个字段,那么当我new一个对象时,内存中会分配所有字段的空间,而我只会使用其中一两个,在资源和效率上都产生极大浪费。那么这样面向对象又有什么意义呢?各位看官以为如何?

我认为,你不用怎么知道好不好呢?代码全部写JSP里也很好啊,开发很快啊。
解决方案五:

引用2楼JAVA_LiuTe的回复:

我的看法就是你愚昧无知,没了解深入就在这里发放阙词。

你就是个什么都说不出来的逗逼
解决方案六:

修正下,是“如果一个Modal有30个属性,而我通常操作只会涉及一两个字段”
解决方案七:

有道理哦,比如只想吃鸡头的时候要把整只鸡抓来砍了头才能吃到鸡头。我觉得挺贴切现实的吧,这个整体的思想我觉得比较容易理解和处理吧
解决方案八:

楼主这种情况,考虑加一层DTO,copy需要的属性,其他都是null。建议不要用的太死板了
解决方案九:

1、楼主说的问题其实不是面向对象问题,而是MVC以及分层设计模式问题。即使不是面向对象的语言里,也有分层设计,比如表示层、功能层、数据访问层(DAL,相当于Model的部分功能,看你怎么定义)。2、MVC的设计在软件界非常广泛,各种语言、各种框架、前端的、后端的、中间层的,为什么这么广泛?所以楼主要深入地想想这些问题,然后再回头看看你提到的问题,可能你发现其实小事一桩,可能是局部细节设计不周吧。所以不要把问题扩大化,把整个面向对象都否定了,这就荒谬了。
解决方案十:

引用5楼someoneelse888的回复:

修正下,是“如果一个Modal有30个属性,而我通常操作只会涉及一两个字段”

1.开发中这样的model我没见过,我做金融系统的,最多的一个类也就不到20个字段。2.如果遇到你说的这种情况,确实不建议用对象来传递属性。但用对象传递属性有它的好处:今天你只改俩个字段,明天可能就变成改3、4个了,这时候你基本不用修改接口(甚至实现可能都不用改)。ORM、MVC好处多多,慢慢体会吧
解决方案十一:

引用7楼xiaopeipei2004的回复:

楼主这种情况,考虑加一层DTO,copy需要的属性,其他都是null。建议不要用的太死板了

觉得DTO是个好主意,但是现在很多人的观点是要抛弃DTO,看这里的讨论:
解决方案十二:

引用8楼stonefeng的回复:

1、楼主说的问题其实不是面向对象问题,而是MVC以及分层设计模式问题。即使不是面向对象的语言里,也有分层设计,比如表示层、功能层、数据访问层(DAL,相当于Model的部分功能,看你怎么定义)。2、MVC的设计在软件界非常广泛,各种语言、各种框架、前端的、后端的、中间层的,为什么这么广泛?所以楼主要深入地想想这些问题,然后再回头看看你提到的问题,可能你发现其实小事一桩,可能是局部细节设计不周吧。所以不要把问题扩大化,把整个面向对象都否定了,这就荒谬了。

对,我正好也看到其他人说到过今天改俩字段,后天编程四字段时Modal的优势,但我觉得这样每次对每个属性全部进行alloc是极大的浪费。
解决方案十三:

引用9楼whos2002110的回复:

Quote: 引用5楼someoneelse888的回复:
修正下,是“如果一个Modal有30个属性,而我通常操作只会涉及一两个字段”

1.开发中这样的model我没见过,我做金融系统的,最多的一个类也就不到20个字段。2.如果遇到你说的这种情况,确实不建议用对象来传递属性。但用对象传递属性有它的好处:今天你只改俩个字段,明天可能就变成改3、4个了,这时候你基本不用修改接口(甚至实现可能都不用改)。ORM、MVC好处多多,慢慢体会吧

对,我正好也看到其他人说到过今天改俩字段,后天编程四字段时Modal的优势,但我觉得这样每次对每个属性全部进行alloc是极大的浪费。
解决方案十四:

当我new一个对象时,内存中会分配所有字段的空间,你不经常用,给他个null不就可以。
解决方案十五:

引用8楼stonefeng的回复:

1、楼主说的问题其实不是面向对象问题,而是MVC以及分层设计模式问题。即使不是面向对象的语言里,也有分层设计,比如表示层、功能层、数据访问层(DAL,相当于Model的部分功能,看你怎么定义)。2、MVC的设计在软件界非常广泛,各种语言、各种框架、前端的、后端的、中间层的,为什么这么广泛?所以楼主要深入地想想这些问题,然后再回头看看你提到的问题,可能你发现其实小事一桩,可能是局部细节设计不周吧。所以不要把问题扩大化,把整个面向对象都否定了,这就荒谬了。

我可能是用javaweb这个场景来说明面向对象封装导致的内存浪费。在面向对象的各种应用场景中,尤其涉及到数据传递,貌似都会存在这样的弊端。不知道Java有没有LazyAlloc的技术?
解决方案:引用13楼u011461314的回复:

当我new一个对象时,内存中会分配所有字段的空间,你不经常用,给他个null不就可以。

如果我把所有的字段都默认分配成null,会不会导致使用时效率降低,这本质上是在lazyalloc麽?像这样:publicclassPost{privateintid=null;privateStringname=null;privateUserposter=null;privateStringtitle=null;privateList<String>tags=null;privateCategorycategorie=null;privateStringcontent=null;}

解决方案:引用12楼someoneelse888的回复:

Quote: 引用9楼whos2002110的回复:
Quote: 引用5楼someoneelse888的回复:
修正下,是“如果一个Modal有30个属性,而我通常操作只会涉及一两个字段”

1.开发中这样的model我没见过,我做金融系统的,最多的一个类也就不到20个字段。2.如果遇到你说的这种情况,确实不建议用对象来传递属性。但用对象传递属性有它的好处:今天你只改俩个字段,明天可能就变成改3、4个了,这时候你基本不用修改接口(甚至实现可能都不用改)。ORM、MVC好处多多,慢慢体会吧

对,我正好也看到其他人说到过今天改俩字段,后天编程四字段时Modal的优势,但我觉得这样每次对每个属性全部进行alloc是极大的浪费。

我就不说你new个对象30个属性都是null到底会浪费多少资源,我没办法量化,但就我理解这对jvm及垃圾收集而言都是小事一桩,不过高并发下肯定是会影响性能。如果你频繁修改接口,哪怕一次,所消耗的开发成本都是很高的,或许你现在感觉不到,代码的高可读性及易扩展是非常重要的,甚至超过你所谓的浪费。这些个框架、规范总是朝着人们更容易理解、接受的方向发展的。扯的有点远...
解决方案:引用7楼xiaopeipei2004的回复:

楼主这种情况,考虑加一层DTO,copy需要的属性,其他都是null。建议不要用的太死板了

真相了,都差点忘记DTO了
解决方案:任何一种技术都是有优点缺点的,我们要做的是找到keyvalue,并解决.
解决方案:我建议楼主看一下关于DDD的书籍,会有答案的。现在大多数项目entity和valueobject根本没有分开
解决方案:支持一下。。。
解决方案:这个不是面向对象的问题,这是你分层的问题,其实对于new一个实体上的浪费不算什么,用了就释放了,倘若不是实体,处理起来就没那么方便了,这是有好也有坏的如果你觉得实在是浪费的话你可以针对每种结构都创建不同的实体,在你的实体提出基类
解决方案:通常会为一个表或者一个功能写一个Modal比如我要增删改查其中的一个字段那你就赋值一个就行了new出来Modal虽然看起来字段多但是set少的话也没什么了而且瞬间执行完内存就释放了不过我们公司已经不用Modal了,封装数据底层都是hashMap实现的,好处就是方便,但是没有get方法看不到里面都有什么属性。
解决方案:引用3楼skgary的回复:

Quote: 引用楼主someoneelse888的回复:
在常见的JavaWeb中,一般会有Modal,Controller,View,DAO,Service几个分层,而Modal在其中发挥怎样的贡献呢?莫非两点:1.对对象属性进行增、删、改时,作为新属性的包装,进行整体传递;2.对对象属性进行查询时对查出的数据进行包装以进行传递。然而实践中,我们在删、改、查时,通常只会涉及部分属性,并不经常动用全部属性。那么再用Modal来包装有什么意义呢?如果一个Modal有30个对象,而我通常操作只会涉及一两个字段,那么当我new一个对象时,内存中会分配所有字段的空间,而我只会使用其中一两个,在资源和效率上都产生极大浪费。那么这样面向对象又有什么意义呢?各位看官以为如何?

我认为,你不用怎么知道好不好呢?代码全部写JSP里也很好啊,开发很快啊。

解决方案:引用22楼hjgzj的回复:

通常会为一个表或者一个功能写一个Modal比如我要增删改查其中的一个字段那你就赋值一个就行了new出来Modal虽然看起来字段多但是set少的话也没什么了而且瞬间执行完内存就释放了不过我们公司已经不用Modal了,封装数据底层都是hashMap实现的,好处就是方便,但是没有get方法看不到里面都有什么属性。

哈哈,关键是思路。或者,直接用grails吧,更简洁,更方便。
解决方案:
解决方案:支持一下......
解决方案:引用10楼someoneelse888的回复:

Quote: 引用7楼xiaopeipei2004的回复:
楼主这种情况,考虑加一层DTO,copy需要的属性,其他都是null。建议不要用的太死板了

觉得DTO是个好主意,但是现在很多人的观点是要抛弃DTO,看这里的讨论:

没有一种设计适用于全部场景,DTO好不好在于用在哪里.我理解的DTO就是传输过程中的对象而已
其他方案:

可以使用构造方法进行控制码?
解决方案:楼主说的和面向对象无太大关系,世上根本没有完美的代码,完美的设计思想,也许今天的面向对象会被明天另一种更好的取代,但那是需要时间的,一步步发展的。你说的问题我们都有遇到,就语言本身来说也有一定的缺陷
解决方案:楼主说得不错,对象型数据的设计确实存在于这样的问题,在我获取一个对象的时候,但是可能我只要操作极少字段,却把整张表的字段都拿出来了,这对内存的节省以及运行效率是不好的,因此,orm的设计总是比直接数据库操作要慢,不过事物都会有两面性,在于如何取舍。1、orm的设计能更好的建立亲近与业务的模型,而普通数据库设计较为模糊,毕竟它只是品面的保存数据而已。2、orm的设计便于数据的使用和传递,对于开发效率而言比直接用sql提取数据更方便简介,也更贴切于开发语言层面。3、设计问题,就像楼主说的,很多时候一张表N多字段,30个算少了,我碰到过上百字段的,一个对象的提取就要把上百字段全部读取显然是不科学的,但是这不是orm的问题,这是设计的问题,一张表字段过多就需要做分表处理的,然后用一对一关系做链接。4、目前的orm技术已经很完善,基本上都有lazy技术来从一个方面来解决这个问题,无论java内部的机制,还是框架的实现,因此你使用的是框架,而不是自己做的orm,其实也不存在相应问题。5、就目前而言,很多事实证明,一个应用效率和对资源的占用,orm带来的困扰是微乎其微的,更何况现如今硬件环境并不像曾经那么拮据的情况,更多的困扰是一个系统本身的设计问题,例如访问瓶颈,内存泄露,不可理的数据提取方式等等。
解决方案:面向对象是为了解决公用的问题而不是特定问题有时面向对象确实让人不爽但是你真拿它没办法包括设计模式都是把简单的问题复杂化
解决方案:引用28楼u013352832的回复:

我是新手,提个方法:可以使用构造方法进行控制码?

构造方法需要把每个参数都传进去吧
解决方案:引用30楼spiniper的回复:

楼主说得不错,对象型数据的设计确实存在于这样的问题,在我获取一个对象的时候,但是可能我只要操作极少字段,却把整张表的字段都拿出来了,这对内存的节省以及运行效率是不好的,因此,orm的设计总是比直接数据库操作要慢,不过事物都会有两面性,在于如何取舍。

把整张表的字段都拿出来?你确定EF只能这样?
解决方案:
解决方案:这里确实存在一个矛盾,用面向对象的方式操作数据库和面向具体字段的方式操作数据库的是不同的。现在后者运行的更快,但是前者在系统比较复杂的时候更利于提高开发效率。说起来这也算一种有目的的牺牲吧。这种牺牲其实是无处不在的。例如,和计算机打交道,最快的是用机器语言,将各个cpu指令的优化推进到极致,但这带来的巨大的开发难度,因此出现了高级语言。高级语言产生的机器码相当于精心编制的机器码而言,很多都是绕了远路的,但毫无争议的是这种绕远是值得的。
解决方案:引用32楼hjgzj的回复:

Quote: 引用28楼u013352832的回复:
我是新手,提个方法:可以使用构造方法进行控制码?

构造方法需要把每个参数都传进去吧

需要几个创建就给几个啊!例如:有20的属性,但是我只需要用3个属性,写一个只有三个构造方法
解决方案:36楼补充下是写一个只带有三个参数的构造方法
解决方案:面向对象只是为了让代码思路更靠近理解思路,方便开发和拓展而已。效率肯定比不上要啥就传啥的。追求效率可以选择C。更快,效率也更高。但是可读性你懂的。
解决方案:引用36楼u013352832的回复:

Quote: 引用32楼hjgzj的回复:
Quote: 引用28楼u013352832的回复:
我是新手,提个方法:可以使用构造方法进行控制码?

构造方法需要把每个参数都传进去吧

需要几个创建就给几个啊!例如:有20的属性,但是我只需要用3个属性,写一个只有三个构造方法

假如你一个页面要用到3个属性还有个页面要用到10个属性你咋办再说也没见过模版是用过构造传参的。。

时间: 2024-10-12 17:28:32

面向对象的荒诞之处的相关文章

JavaScript原型和继承

那么原型有什么用呢? 先了解下new运算符,如下: var a1 = new A; var a2 = new A; 这是通过构造函数来创建对象的方式,那么创建对象为什么要这样创建而不是直接var a1 = {};呢?这就涉及new的具体步骤了,这里的new操作可以分成三步(以a1的创建为例): 1.新建一个对象并赋值给变量a1:var a1 = {}; 2.把这个对象的[[Prototype]]属性指向函数A的原型对象:a1.[[Prototype]] = A.prototype 3.调用函数A

JavaScript原型和继承用法详解

一.函数创建过程 在了解原型链之前我们先来看看一个函数在创建过程中做了哪些事情,举一个空函数的例子: function A() {}; 当我们在代码里面声明这么一个空函数,js解析的本质是(肤浅理解有待深入): 1.创建一个对象(有constructor属性及[[Prototype]]属性),根据ECMA,其中[[Prototype]]属性不可见.不可枚举 2.创建一个函数(有name.prototype属性),再通过prototype属性 引用 刚才创建的对象 3.创建变量A,同时把函数的 引

JavaScript原型和继承的学习笔记

前几天看了<再谈js面向对象编程>,当时就请教哈大神,发现文章有的地方可能会造成误导(或者说和ECMA有出入),后来自己翻一翻ECMA,总算找到"标准"的理解-- 本文适合初学者,特别是对构造函数.原型和原型链概念比较模糊的,大牛请路过,好了,让我们一步步来看看 Javascript原型(链)到底有多神秘-- 一.函数创建过程 在了解原型链之前我们先来看看一个函数在创建过程中做了哪些事情,举一个空函数的例子: function A() {}; 当我们在代码里面声明这么一个空

面向对象的css:团队协作开发规范和按结构划分模块

文章简介:面向对象的css有两个主要原则:separate the structure from the skin,separate the container from the content.第一个原则体现在模块化思想可以理解为,模块的设计制作和布局框架本身相分离,意味着你的模块不能只为某个布局而编写样式,像微博这类存在换肤功能的产 说起模块化,也许我们首先想到的是编程中的模块设计,以功能块为单位进行程序设计,最后通过模块的选择和组合构成最终产品.把这种思想运用到页面构建中,也已经不是什么新

JAVA程序员必读:基础篇(2)面向对象编程概念

编程|程序|程序员|对象|概念 如果你以前从来没有使用面向对象语言,你需要在开始编写JAVA代码之前先理解这个概念.你需要理解什么是对象.什么是类.对象和类的关系怎样以及使用消息怎样在对象之间进行通讯.本教程的前面部分将描述面向对象编程的概念,而后面的教程将教你怎样将这个概念编成代码. 2.1什么是对象 对象是一些相关的变量和方法的软件集.软件对象经常用于模仿现实世界中我们身边的一些对象.对象是理解面向对象技术的关键.你在学习之前可以看看现实生活中的对象,比如狗.桌子.电视.自行车等等.你可以发

面向对象的设计与实现的一些基础但重要的概念

对象|概念|设计      在面向对象的设计和实现里,我们必须花时间和精力搞清楚这些概念:抽象,封装,继承和多态,以 及面向对象的设计原则,否则就不会真正理解面向对象的灵魂,也不会感受到面向对象设计思想给我们 带来的好处.   在学习几年oo和几次实践后,我决心对这些最基本的东西进行一次总结.并以这几个问题作为分析的 实例.   1.接口与类的区别     2.为什么要优先考虑合成聚合复用   3.多态会给我们带来那些方便   4.几个设计原则的关系是什么   5.设计模式有用吗?它是什么?怎样

面向对象的关系数据库设计

一.概念的区分 有些人把面向对象的数据库设计(即数据库模式)思想与面向对象数据库管理系统(OODBMS)理论混为一谈.其实前者是数据库用户定义数据库模式的思路,后者是数据库管理程序的思路.用户使用面向对象方法学可以定义任何一种DBMS数据库,即网络型.层次型.关系型.面向对象型均可,甚至文件系统设计也照样可以遵循面向对象的思路. 面向对象的思路或称规范可以用于系统分析.系统设计.程序设计,也可以用于数据 结构设计.数据库设计.OOSE自上至下.自始至终地贯彻面向对象思路,是一个一气呵成 的统一体

PHP V5.3 用延后静态绑定搞活面向对象编程

PHP V5.3 通过其延后静态绑定(LSB)特性解决了面向对象编程(OOP)的一些问题.了解 LSB 如何修复 PHP 的 OOP 编程问题以及如何实现需要使用 LSB 的一些众所周知的面向对象设计模式. 面向对象编程(OOP)可让开发人员通过使用数据抽象.封装.模块化.多态性和继承减少和简化代码 - 在对 OOP 有着深刻的理解的前提下.对 OOP 特性的了解还让 PHP 编码者得以利用设计模式 - 一些众所周知的用来解决常见问题的算法.PHP 自 V3.0 就已经提供了 OOP 功能,但直

Javascript面向对象详解(第一部分)

一直想写一篇关于Javascript面向对象的文章,最近终于动工了,本来以为不会写的很长,可是后来发现有很多东西要写,大家先看着这前面的一部分吧,后面有更多的高级特性陆续跟进中,放心,绝对不是太监贴啊,对Javascript对象不太了解或者没有了解的人可以仔细看看哦,有错误之处大家多多指正哦,本人水平有限 (1)为什么要面向对象 在十年前或者也许更晚的时候,javascript都是一种被人当作玩具来使用的语言,大多时候,没有人乐于深入研究它的特性,而只是用它来实现各种花里胡哨的特效来炫耀自己的技