V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hujianxin
V2EX  ›  程序员

大哥们,面向对象设计能力如何提高?

  •  
  •   hujianxin · 2016-07-24 19:29:28 +08:00 · 5063 次点击
    这是一个创建于 3029 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我学习编程时间也不短了,从 c 语言入门到现在已经两点多了吧。中间学过 Python , Java , Scala 。现在学习以 Java 为主。但是对面向对象还是不能有很好的理解。

    例如,我需要完成一个任务,任务是: 将一个文件夹下的所有的 xlsx excel 文件转到 oracle 数据库中。 Java 中的 POI 包可以操作 excel 。 poi 里面有一个 workbook 类。可以操作 sheet , row , cell 等。我觉着抽象程度已经很高了。

    在这个任务中,我还需要继续将 excel reader 这个任务继续抽象吗?如果继续抽象改完成什么样的功能设计呢?

    虚心求教各位程序员大哥,希望能帮我解答一下疑惑。

    另外,除了多写程序以外,还有什么书,网站,能够提高这方面的能力有帮助呢?

    30 条回复    2016-07-26 13:57:59 +08:00
    pyufftj
        1
    pyufftj  
       2016-07-24 19:52:17 +08:00
    如果你接触一些比较大型的项目就会发现面向对象的优点,对于代码的修改及功能的扩展都要方便的很多。如果你用过程化的方式,就很容易乱作一团。。纯属个人见解。一些简单的任务,面向对象或者过程化是看不出来的。
    HypoChen
        2
    HypoChen  
       2016-07-24 20:49:17 +08:00
    首先,你需要一个对象(大雾
    说正经的,对于设计方面的提高就算是看书什么的也是很难提高的,之前写的代码少,在看设计模式的时候,只知道他好并不知道为啥好,在什么时候能发挥最大的威力。软件设计也是一样,看书啊什么的不建立在大量实践的基础上是很难真正消化的。当你遇到过并实现很多场景,然后再去看那些美妙的设计,会让你有众里寻他千百度的感觉。
    所以,现在要做的不是在纠结怎么设计,而是放手去实践吧。
    tracymcladdy
        3
    tracymcladdy  
       2016-07-24 21:02:05 +08:00
    面向对象就是个忽悠。
    面向接口编程才是正解。
    wizardforcel
        4
    wizardforcel  
       2016-07-24 21:19:59 +08:00 via Android
    思想和架构类的书。编程之美、编程珠玑、架构之美、开源软件架构。

    另外对于你那个问题, poi 是读取通用 excel 的,但如果有业务上专用格式的 excel ,还可以继续封装。
    cs419
        5
    cs419  
       2016-07-24 21:52:27 +08:00
    实体类有用过吗, list<User>
    一条 user 数据作为对象包含了一些属性
    user.name user.pwd user.age
    jatesun
        6
    jatesun  
       2016-07-24 22:11:20 +08:00 via iPhone
    多敲代码多看书多看源码。。。
    Srar
        7
    Srar  
       2016-07-25 02:37:09 +08:00   ❤️ 1
    多重构
    linux40
        8
    linux40  
       2016-07-25 06:53:03 +08:00 via Android
    uml ?
    hujianxin
        9
    hujianxin  
    OP
       2016-07-25 06:57:27 +08:00
    @pyufftj 有道理,我这种小需求应该还到不了设计的地步
    hujianxin
        10
    hujianxin  
    OP
       2016-07-25 06:58:18 +08:00
    @HypoChen @jatesun 看来只有实践才是捷径啊
    hujianxin
        11
    hujianxin  
    OP
       2016-07-25 06:59:35 +08:00
    @cs419 没有用过这个方式,我不太明白你指的什么呢?能不能再稍微解释一下
    hujianxin
        12
    hujianxin  
    OP
       2016-07-25 07:17:45 +08:00
    @wizardforcel 多谢推荐
    russj
        13
    russj  
       2016-07-25 08:56:15 +08:00
    这个是用来忽悠老板的
    cxh116
        14
    cxh116  
       2016-07-25 09:09:39 +08:00 via Android   ❤️ 1
    先写测试,这样写出的方法会考虑怎么供调用方使用才好。
    zeroten
        15
    zeroten  
       2016-07-25 09:10:42 +08:00
    首先要有个对象
    gdzdb
        16
    gdzdb  
       2016-07-25 10:18:10 +08:00
    多做项目,
    在开发中发现问题,自己尝试解决方案,在方案中再找到问题,再优化,形成总结。
    看优秀的开源项目的代码,理解代码。
    然后再找本关于设计模式的书看看。
    eurry
        17
    eurry  
       2016-07-25 10:45:01 +08:00
    不要迷信什么面向对象
    nonesuccess
        18
    nonesuccess  
       2016-07-25 10:49:45 +08:00
    你的代码里面有重复的部分吗?作为一个有良好习惯的程序员,粘贴代码这样的毛病就当你没有了,那你程序思路上有重复的部分吗?

    比如你的 xlsx 格式有若干种,如果你的考虑问题的思路是: 1 、将 xlsx1 中的数据, xx 列复制给表 1 中的 xx 列, xx 列复制给表 1 中的 xx 列, 2 、将 xlsx2 中的数据, xx 列复制给表 2 中的 xx 列……那就没什么重复的部分,就当搬砖继续干去吧。

    但是如果你的思路转变为:将每个 xlsx 中的若干列以一定的规则复制到某张表中,那所有的转换逻辑都是重复的部分。你需要封装一个 Strategy 对象,用于表示 xlsx 和数据库表的对应规则,以及列的转换规则,然后外层调用的时候统一代码,不同的 xlsx 只需要传入不同的 strategy 就可以了。


    第二就是,你的代码将要应对什么样的变化。

    比如明天就可能把 oracle 换成 mysql 了,那就要封装一个 dbDriver 出来。当然这件事 jdbc 已经帮你做了,不过具体到你的业务场景中,很可能不同的数据库有不同的转换逻辑,比如日期类型的字段在 mysql 中要转换为 date ,在 oracle 中要转换成 datetime 之类的。这样的话,你再自己封装一层比较好。
    techmoe
        19
    techmoe  
       2016-07-25 11:52:12 +08:00 via Android
    首先你要有对象()
    pyufftj
        20
    pyufftj  
       2016-07-25 12:11:04 +08:00
    @zeroten 我一天可以 new 100 个
    goubenger
        21
    goubenger  
       2016-07-25 12:17:30 +08:00
    面向对象设计通过面向工资工作提高
    neurobot
        22
    neurobot  
       2016-07-25 13:51:13 +08:00
    可以看一下<<Thinking in UML>>,不算太老,非常有启发
    likai
        23
    likai  
       2016-07-25 14:33:54 +08:00
    面向组件编程
    Raku
        24
    Raku  
       2016-07-25 17:58:34 +08:00 via iPhone
    @tracymcladdy 同意~
    everettjf
        25
    everettjf  
       2016-07-26 00:16:33 +08:00
    Balthild
        26
    Balthild  
       2016-07-26 02:42:56 +08:00 via Android
    @pyufftj 太弱了,用 while (1) 可以每天 new 几乎是无限个,一直 new 到内存受不了为止
    sampeng
        27
    sampeng  
       2016-07-26 11:34:00 +08:00
    首先要有一个对象
    sampeng
        28
    sampeng  
       2016-07-26 11:35:23 +08:00
    多写比多看书强无数倍。
    把自己写的代码拆无数次,一直到优雅,扩展方便,理解方便。。自然水到渠成。
    光看书?面试用用可以,实践差的不是一点半点
    pyufftj
        29
    pyufftj  
       2016-07-26 13:09:43 +08:00
    @Balthild 对象太多了也受不了,有几个就可以啦。
    David6516
        30
    David6516  
       2016-07-26 13:57:59 +08:00
    @sampeng 赞同,仁兄正解~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2326 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 15:51 · PVG 23:51 · LAX 07:51 · JFK 10:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.