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

Java 如何处理好方法(函数)与类的关系? 回答全部奖励,谢谢!

  •  
  •   anonymoustian · 2016-01-06 09:16:52 +08:00 · 2645 次点击
    这是一个创建于 3245 天前的主题,其中的信息可能已经有所发展或是发生改变。

    是这样,我之前对面向对象的语言一直有这个疑惑。

    比如我要开发一个计算器,那么我用 C 语言写的话那我就会定义 很多函数, 比如 add 、 sub 等等。

    但是 java 的话因为引入了面向对象的机制,我 就不太懂什么时候应该用类、什么时候应该用方法,也就是我应该如何组织呢? 谢谢!

    10 条回复    2016-01-07 06:39:09 +08:00
    xylophone21
        1
    xylophone21  
       2016-01-06 09:24:10 +08:00   ❤️ 3
    基本上,最简单的方法

    C header file ==> class
    C api ==> public method
    czheo
        2
    czheo  
       2016-01-06 09:28:25 +08:00   ❤️ 1
    1F 的总结不错。怕 lz 理解不到那个份儿上。
    BTW, Java 是非常偏激的语言,做什么事情都用 class 。
    liuxey
        3
    liuxey  
       2016-01-06 09:32:51 +08:00   ❤️ 1
    Java 中任何对象和数据都要由类为载体,当然枚举其实也是类,了解这个后就可以开始了:
    先写一个 Caculate 类,里面实现+-*/等计算逻辑,还有一些高级运算
    再写一个 Caculator 类,作为计算器的主体,其中有一个私有变量 Caculate 的实例,
    Caculator 的接受外部的各种输入,最后调用 Caculate 实例的计算方法,最后输出

    这是简单的做法,想要很彻底的面向对象来实现,这还不够
    thinkmore
        4
    thinkmore  
       2016-01-06 09:53:08 +08:00   ❤️ 1
    java 写一个计算机只需要用到少量的数据结构知识,比如说 statck 或者说 tree,所以写一个方法就可以搞定。至于说使用类的话,一个类需要有什么属性,你觉得你的计算机哪些是共有的,提出来就好了,等你写好了优化就行
    1000copy
        5
    1000copy  
       2016-01-06 10:13:57 +08:00   ❤️ 1
    类就是一个外套,把你原来的方法和全局变量外边套上就可以。比如
    原来你写的计算器:
    int lastvalue = 0
    add()
    dec()

    现在要做的就是套上{},加个类名
    class WOkao{

    int lastvalue = 0
    add()
    dec()

    }

    这就是类了。

    好处就是全局变量没有了,内部化了。

    用的时候,稍微麻烦就是得实例化。要 new 。之后就一回事。

    做到这步,你就是封装了。了解这个是了解继承,多态的基础。
    asj
        6
    asj  
       2016-01-06 10:18:37 +08:00   ❤️ 2
    从需求开始,需求里的名词就是一个候选的类。然后把动作围绕名词放好,这些是候选的类的方法。
    以你举的例子,名词计算器可能就是一个类,加减之类的动作是它的方法。
    进一步引申的话,假设要实现的是一个实体的计算器,那种摆在桌上按按钮,有个液晶屏的那种。
    你会发现因为有状态,比如按了按钮 2 以后,如果前面按的是 1 ,显示 12 。如果前面按的是 1 +,显示 2 。结果和前面按的按钮有关,这种情况下用 C 风格的代码写就会相当不自然。
    如果用面向对象方式,“计算器”是一个类,“按按钮”是它的一个方法。“按钮”也是一个类,它会作为按按钮的参数传给计算器。每次方法操作后,计算器的状态变化,记录在它的内部。通过“显示”方法把当前状态输出出来。
    进一步复杂化的话,比如要代码控制液晶屏上的灯,每个数字由 8 个灯组成。那么“液晶屏”是一个类,有“显示数字”方法。计算器调用这个方法把要显示的结果传入即可。
    这样虽然整体的复杂度提高了。但是显示的逻辑并不会影响到计算器的逻辑,因为两个类担负了不同的职责。只要它们之间的接口没有改变,一方内部的复杂度不会传染到另一部分。
    icegreen
        7
    icegreen  
       2016-01-06 11:22:53 +08:00   ❤️ 1
    我一般划分类的思路:
    1. 从逻辑上,或者根据表结构把一类东西封装成一个类;
    2. 如果一个类方法太多可以考虑是不是可以细化拆分,是不是类划分不合理;
    3. 判断类划分是否合理还可以看方法传入的参数; 有时候方法是可以变成参数类的成员函数的;
    Dwayne
        8
    Dwayne  
       2016-01-06 19:20:37 +08:00   ❤️ 1
    是不是该建议楼主看设计模式
    WispZhan
        9
    WispZhan  
       2016-01-06 23:34:57 +08:00   ❤️ 1
    @Dwayne 看来楼主根本没到那个地步,应该先看,面向对象编程。推荐 《 Head First 面向对象分析与设计》
    -----------------------------

    另外别乱推荐新手来“设计模式”,基本上开始就是生搬硬套,估计到时候在你项目组里出现 你就哭吧。

    首先要知道 OOP,然后才设计模式。连面向对象的几个设计法则都弄不明白,也是能硬套设计模式,到时候就是不伦不类。
    wizardforcel
        10
    wizardforcel  
       2016-01-07 06:39:09 +08:00 via Android   ❤️ 1
    把你的 struct 变成类 struct 的配套函数 放头文件里的写成 public 静态的写成 private

    另外没有必要为了 oo 而 oo ,功能性的函数直接写成静态的就好了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2664 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 05:39 · PVG 13:39 · LAX 21:39 · JFK 00:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.