V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Newyorkcity
V2EX  ›  问与答

Java 编程思想里关于 OOP 的这段说明读了之后还是有些不理解,能听一听你的看法么?

  •  
  •   Newyorkcity · 2020-03-15 22:30:46 +08:00 · 931 次点击
    这是一个创建于 1530 天前的主题,其中的信息可能已经有所发展或是发生改变。

    所有编程语言都提供抽象机制。可以认为,人们所能够解决的问题的复杂性直接取决于抽象的类型和质量。所谓的“类型”是指“所抽象的是什么?”汇编语言是对底层机器的轻微抽象。接着出现的许多所谓“命令式”语言(如 FORTRAN、BASIC、C 等)都是对汇编语言的抽象。这些语言在汇编语言基础上有了大幅的改进,但是它们所作的主要抽象仍要求在解决问题时要基于计算机的结构,而不是基于所要解决的问题的结构来考虑。程序员必须建立起在机器模型(位于“解空间”内,这是你对问题建模的地方,例如计算机)和实际待解问题的模型(位于“问题空间”内,这是问题存在的地方,例如一项业务)之间的关联。建立这种映射是费力的,而且这不属于编程语言所固有的功能,这使得程序难以编写,并且维护代价高昂,同时也产生了作为副产物的整个“编程方法”行业。

    这儿略去了原文中的一段。这块内容在 java 编程思想(第四版)第一章开篇那块。

    面向对象方式通过向程序员提供表示问题空间中的元素的工具而更进了一步。这种表示方式非常通用,使得程序员不会受限于任何特定类型的问题。我们将问题空间中的元素及其在解空间中的表示称为“对象”。(你还需要一些无法类比为问题空间元素的对象。)这种思想的实质是:程序可以通过添加新类型的对象使自身适用于某个特定问题。因此,当你在阅读描述解决方案的代码的同时,也是在阅读问题的表述。相比以前我们所使用的语言,这是一种更灵活和更强有力的语言抽象。所以,OOP 允许根据问题来描述问题,而不是根据运行解决方案的计算机来描述问题。但是它仍然与计算机有联系:每个对象看起来都有点像一台微型计算机—一它具有状态,还具有操作,用户可以要求对象执行这些操作。如果要对现实世界中的对象作类比,那么说它们都具有特性和行为似乎不错。

    就是那种好像懂了又好像没懂的感觉,就很恼火,所以前来请教。。感谢提供想法!

    3 条回复    2020-03-16 08:57:02 +08:00
    cmdOptionKana
        1
    cmdOptionKana  
       2020-03-15 22:43:18 +08:00
    不要急着弄懂,随着后面的学习和实践,自然就懂了。这里说的东西不懂并不影响继续学习。
    lewis89
        2
    lewis89  
       2020-03-16 07:01:09 +08:00   ❤️ 1
    学习 OOP 最好的方式就是去用它,因为大多对 OOP 的解释都太形而上学了,并没有落到实践中去,其实等你学完了之后,你会发现,OOP 根本没什么,只是一个种较为特殊的模块化思想而已,用 if-else 加上特定的约束,C 语言这种完全没有 OOP 痕迹的语言同样可以实现面向对象,只不过很 ugly 而已,所以对你来说现在最好的办法就是囫囵吞枣,先全盘记住就好,后面用的时候就慢慢明白了。

    另外说一句,我刚开始看到 OOP 的时候也是一脸蒙圈,因为我最早是学习 C 语言入门的,但是学完之后就知道 OOP 并没有什么新东西,真的就是包了一层 if-else,在这之上衍生了一些方法论,而且就我实践看来,大部分与 OOP 相关的方法论都是有副作用的或者说是有毒的,例如设计模式,如果你的代码还没开始写,就想着模块化,就想着未来那些地方会有变动,先套个设计模式,然后设计好一个架子,未来希望通过接口再来扩展,我敢打包票,你这代码就没法写了,在我长期的实践中,通常是发现一个地方需要改动,再去设计,而不是一开始就进行设计,因为很多业务代码,其变化的方向,根本不是程序员能决定的,而是业务需求变化驱动的。
    nvkou
        3
    nvkou  
       2020-03-16 08:57:02 +08:00   ❤️ 1
    动手.尤其是拥有甲方后就会有深刻理解了
    原型:
    用户有这些属性 /方法......搞定
    甲方:
    我们要 VIP 功能,现在就要
    你:
    好吧...en.. class VipUser extends User. 搞定
    甲方:
    我们要 vip 能像超管一样管理后台!
    你:
    什么鬼,希望甲方知道自己在干什么. 好吧 class VipUser implement adminLogin extends User 搞定
    甲方:
    我们要 VIP 能 xx 某个用户. 但具体怎么样我也不知道.反正最后 VIP 要得到一个超炫的通知说"成功了"
    你:
    噢. 那就先抽象吧. 前后端先对接好. abstract function String xx(VipUser tuhao)
    甲方:
    收益不行啊,再搞个 VVIP! VVVIP! 和瞎眼的 VVVVIP! 以后再加!
    你:
    哦.. class VipUser<T extends VipUser > implements adminsLogin extends User.

    OOP 个人认为是尽量在把编程语言和思维向自然语言靠. 但是任何一种编程范式都敌不过甲方的恣意妄为的 :)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   996 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 20:07 · PVG 04:07 · LAX 13:07 · JFK 16:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.