【问题标题】:Important Concepts I want to Hone my Understanding of我想磨练理解的重要概念
【发布时间】:2012-01-15 05:18:14
【问题描述】:

所以我已经编程了不到一年,我已经自学了 Python、PHP 和 Javascript 的一部分。我真的在努力成为一名更好的程序员并理解编程背后的理论(本质上似乎是对信息的操纵)。

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

函数和类有什么区别?似乎它们都是可以传递参数的东西 - 我知道类比函数“更高”。

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

任何建议都会有所帮助。

【问题讨论】:

  • 这些问题太多了;一般来说,SO 帖子应该专注于一个特定的主题......
  • 但总的来说,如果您在区分命名空间和变量时遇到困难,我强烈建议您选择一本不错的初学者书籍,了解您选择的语言。
  • @Oli,如果你在 JavaScript 中工作,命名空间、函数和变量之间的区别还很不清楚。

标签: function class namespaces computer-science theory


【解决方案1】:

好的,让我们从上到下:

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

现实世界的比喻是图书馆。图书馆包含所有书籍,但图书馆的某些部分专门用于特定领域是有意义的,例如关于物理的书籍(代码)

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

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 类 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。 Man 源自 Animal,因此与 Dog 一样获得 IsAlive,但是 Man 然后可以定义替代行为,即 AbilityToMakeTools 而不是狗。

我发现,一旦您开始将类设想为现实世界的对象/过程(一切都可以建模,甚至是最抽象的“事物”),那么类就开始具有逻辑意义。

HTH

【讨论】:

  • 我还想声明,这些原则与语言无关,即它们适用于几乎所有现代 OOP 语言。 Javascript也不例外。尽管所有东西都是函数(){},但这些函数也可以通过使用“闭包”来表现得像类一样。
【解决方案2】:

问题的部分问题(相关性警察可能很快就会关闭)是您使用的许多术语具有不同的含义,具体取决于您使用的语言范例。 PHP 中的函数与 JavaScript 中的函数是不同的野兽。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多