我想要了解的重要概念

时间:2011-12-07 17:23:20

标签: function class namespaces computer-science theory

所以我现在已经编程了不到一年,我自学了Python,PHP和Javascript的部分内容。我真的想成为一个更好的程序员并理解编程背后的理论(这实际上似乎是对信息的操纵)。

基本上它似乎编写了良好的代码 - 它必须是模块化的 - 这降低了程序的复杂性,这反过来又使它们更容易阅读和再现类似的效果。这使用函数和类。

一个函数和一个类有什么区别?看起来它们都是可以传递给它的参数 - 我理解一个类比函数“更高”。

什么是命名空间?它与变量有什么不同?一个数据结构?我在哪里可以找到有关此类信息的资源?我看过互联网,但很多看起来像是gobblygook。我也已经有了学士学位,所以我不打算回到第二学位。我只想在这一点上成为一名更好的程序员。我已经做了足够的“黑客攻击”,我得到了基本的概念,但理论基础仍然不是全部。

任何建议都会有所帮助。

2 个答案:

答案 0 :(得分:1)

问题的一部分问题(相关警察可能会很快关闭)是你使用的很多术语根据你使用的语言范例有不同的含义。 PHP中的函数与JavaScript中的函数不同。

我建议从“JavaScript:好的部分”开始,以便从在JS工作的人的特定角度理解。

答案 1 :(得分:1)

好吧让我们自上而下:

命名空间是代码的逻辑顺序。

现实世界的类比是图书馆的类比。图书馆包含所有书籍,但是将图书馆的各个部分专门用于特定领域是有意义的。关于物理学的书籍(代码)

Class是一个模型(几乎总是派生自真实世界的对象),它暴露了函数和属性。类可以(并且应该)封装(隐藏)开发人员不希望其他开发人员能够访问的属性和函数。考虑:

public class Car{

public Car(){}//default constructor.
public Car(int tirecount){//this constructor allows initialisation of the class to some 'safe' state
    Tires = new Tire[tirecount];
}
//properties 
public Tire[] Tires{get;set}//bad. at any point you can remove a tire from the car
public bool IsStopped{get;private set;}//safe. can check if car is stoppped outside class but can only change value inside car    

    //functions (...methods)
    public Start(){//starts car
        IsStopped = false;
    }
    public Stop(){
        IsStopped = true;
    }
    public RemoveTire(int tireIndex)
    {
        if(!this.IsStopped)this.Stop();
        Tires[tireIndex].Remove();//safe to remove tire when stopped
    }
}

为了获得代码重用和多态行为,您必须阅读有关接口的内容。接口允许定义合同。合同的内部实现可以更改,但是如果不破坏依赖于该合同的原始代码,则无法更改已定义的方法。可以在不破坏旧实现的情况下添加额外协议。例如:

Class Man实现了ITalk Class Dog实现了ITalk

ITalk合同声明'我有'发言'功能,即

interface ITalk{
     void Speak();
}

class World
{
    List<ITalk> beings;

    public World(List<ITalk> beingsToPopulateWorldWith)
    {
        beings = beingsToPopulateWorldWith;
    }

    public void MakeAllAnimalsTalk()
    {
        foreach(var b in beings)b.Speak();//because we know all object in the beings list use the ITalk interface (contract) we KNOW that we can call .Speak(). What each ITalk does in speak is up to them but we know we can call it.
    }
}

所以Man.Speak()可以输出“Hi”,Dog.Speak()可以输出“Woof”。

类也可以扩展,所以请考虑Man / Dog示例。他们的基类可能是动物。 Animal定义了IsAlive。男人来自动物,所以获得IsAlive和狗一样,但是人可以定义替代行为,即AbilityToMakeTools而不是狗。

我发现,只要你开始将类设想为真实世界的对象/进程(一切都可以建模甚至是最抽象的“东西”),那么类开始具有逻辑意义。

HTH