首页 > 面向过程向面向对象的转变,跪求!

面向过程向面向对象的转变,跪求!

之前学C语言埋下了深深的面向过程习惯,现在用js开发,想用面向对象的方式来写代码却毫无头绪,完全不知道该如何下手,比如说哪些参数作为对象属性,哪些用来作为方法内部的属性,哪些该写成一个方法,真的是要疯了,跪求大神解救啊!


设计模式
设计模式
设计模式

重要的东西说三遍,不会使用设计模式的思想你永远写不了好的面向对象,而且设计模式也很简单


面向对象一般要配合着设计模式,我也是只会过程式不会抽象面向对象,也正在学习中。你把面向对象学完应该接着学习设计模式,会有帮助的


如果只有C经验,JS并不是一门合适的用来体会面向对象的语言。JS中实现面向对象的思路(原型继承)和市面上几乎所有语言都不一样,并且有自己的独特性和难点。

相比较之下Java、C#是“正统面向对象”的选择
以Python、PHP、Ruby为代表的脚本语言虽然大都是{面向过程/面向对象/函数式}的混合,但其中OO部分远比JS容易理解&相对通用

如果你的目标是学JS,那就学JS,如果你的目标是学OOP,那《JS中的OOP》和《其他语言OOP》基本是两件事情。以上。


只要多写就好了,我估计大多数人一开始的时候都写过很多class{}包裹起来的过程代码,多写多总结就好了。

最好是找点比较好的项目,那种你自己会使用到的项目,自己尝试写一次,然后再去读别人的实现,反省一下自己的实现有什么问题。

带着实践过程中的问题,再去读OOP的文章和书,就会有体会。

总之,别想速成,这个时间是以年为单位的。


C语言中有struct,使用struct你可以定义自己想要的类型,比如

struct Person{  
    char name[20];  
    int age;  
    char interest[20];  
}; 

可以看出,我们自定义了一个新的类型,有name、age、interest三个属性。

对于JS,我并不太懂,但是我就以C++举例吧,我们可以定义一个Person类

class Person{
    private:
        char name[20];
        int age;
        char interest[20];
    public:
        void Say();
        void Run();
};

这个新定义的类,有name、age、interest三个属性,看起来是不是很像C语言中的struct,但是在C++的类中还可以定义类的方法,比如Person是人,可以说话,所以就定义了Say()方法,可以跑步,所以定义了Run()方法。

这里面只是简单的解释,但是面向对象会涉及到很多的知识,比如:设计模式、访问控制符、继承等。


用拟人的修辞手法,生动形象地表达出代码的作用


面向对象是一种编程思想, 而不是编程语言.

用C语言也可以写出具有面向对象概念的的程序来, 所谓的面向对象只是编译器提供给你的特性.

面向对象的三大特性--继承,封装与多态要好好去理解, 不是仅仅知道就可以, 而要深入去理解, 以后想深入的话可以试着去理解编译器是怎么来实现这一块东西的. 然后就是多写代码, 从C过渡的话, 最难的应该就是要把代码封装成类吧, 一开始都不习惯的, 都是一个函数一个函数写, 然后调用就好了, 强迫自己把函数功能分类, 一个类只提供同类型的一系列功能, 然后通过实例来调用. 差不多这么多吧.


假如你养狗,

然后每天做的事情

就这么直到狗死

用 C 来实现是什么样呢

typedef struct {
    char* name;
    bool alive;
} Dog;

typedef enum { false, true } bool; 
int main() {
    Dog* pDog = adopt_dog();
    name_dog(pDog, "wangwang");
    
    while (pDog->alive) {
        feed_dog(pDog);
        bring_dog_to_toilet(pDog);
        if (is_raining) {
            play_inside(pDog);
        } else {
            play_outside(pDog);
        }
        bathe(pDog);
        play_with(pDog);
        goto_sleep(pDog);
    }
    
    bury(pDog);
}

可以看到,这一系列的事情,都有一个主体:狗。当然用 javascript 也可以同样的实现,不过要说的是面向对象方式

用 javascript OOP 来实现是什么样呢

咱只说OOP,语法搞不懂自己先查查,这要说语句就一言难尽了

var Dog = (function() {
    // 构造函数
    function Dog() {
        this.alive = true;
    }
    
    // 静态方法
    Dog.adopt = function() {
        var dog = new Dog();
        // 这里办理领关手续等,最后返回一个 Dog 对象
        return dog;
    };
    
    // 定义实例方法
    Dog.prototype.setName = function(name) {
        this.name = name;
    };
    
    Dog.prototype.feed = function() { /* ... */ };
    Dog.prototype.gotoToilet = function() { /* ... */ };
    Dog.prototype.playInside = function() { /* ... */ };
    Dog.prototype.playOutside = function() { /* ... */ };
    Dog.prototype.playWithOwner = function() { /* ... */ };
    Dog.prototype.bathe = function() { /* ... */ };
    Dog.prototype.gotoSleep = function() { /* ... */ };
    Dog.prototype.bury = function() { /* ... */ };
    
    return Dog;
})();
// 就当这是 main function 了
(function() {
    var dog = Dog.adopt();
    dog.setName("wangwang");
    while (dog.alive) {
        dog.feed();
        dog.gotoToilet();
        if (isRaining) {
            dog.palyInside();
        } else {
            dog.playOutside();
        }
        dog.bathe();
        dog.playWithOwner();
        dog.gotoSleep();
    }
    
    dog.bury();
})();

有啥一样有啥不一样

可以看出来面向对象和面向过程其它没多大区别,主要流程还是顺序、分支、循环。其主要的区别在于,函数(方法)所附着的对象。

面向过程的时候,操作是没有固定对象的,需要将要处理的对象作为一个参数传递进去。而且对于一个开发者来说,你也不知道对狗操作的函数到底有哪些。

然后,面向对象呢,狗是一个对象。所有狗都有共同的操作(方法)只是在不同的场景下使用不同(选用和顺序不同等)。而每一个对象都有自己的属性,比如狗狗的 namealive,这和 C 中的结构体是一回事。而在调用的时候,都是以对象为开始,目标对象很明确。而且通过 Dog 的定义,也能知道狗到底有哪些操作可以进行。(虽然一般都是在文档里说清楚的,但是现代IDE的自动完成功能已经在很大程度上代替了翻文档这件事)

其实说白了,面向对象的关键在于对象……没有对象,一切都无从说起。对于由OOP而生的一大堆设计模式,同样可以用单纯的 C 语言实现出来。我记得 Gnome 就是纯 C 风格的界面库嘛……人家 OOP 的 Qt 能干的事情,非 OOP 的 GNome 一样可以干

GNome 后来封装了 OOP 的 C++ 库,这个事情就不要在这里纠结了。


我就不信你写c的时候不大量使用结构体和配套的函数。


大道至简. 面向对象的起因是希望程序语言更接近人类语言.

过程语言 像是叙事文.
面向对象 则更像是散文.或者说明文. 只要把事务描述清楚就好

面向对象的低层也是过程语言. 一个类.一个方法 最终在被调用时.还是依照调用顺序被执行.面向对象倾向于描述事务而不是描述过程.

使用角度.面向对象处理业务复杂度高的问题时,更有优势.

有人说java是面向对象的. 但你依然可以用它当过程语言来写.所以没啥好与不好. 只有更加适合.

【热门文章】
【热门文章】