F#奇妙游(16):基于对象和面向对象

面向对象编程掉书袋

Object-oriented programming (OOP) is a programming paradigm that uses abstraction to create models based on the real world. It uses several techniques from previously established paradigms, including modularity, polymorphism, and encapsulation. Today, many popular programming languages (such as Java, JavaScript, C#, C++, Python, PHP, Ruby and Objective-C) support OOP.

面向对象编程(OOP)是一种使用抽象创建基于现实世界的模型的编程范例。它使用了以前建立的范例中的几种技术,包括模块化、多态和封装。今天,许多流行的编程语言(如Java、JavaScript、C#、C++、Python、PHP、Ruby和Objective-C)都支持OOP。

Object-oriented programming (OOP) is a programming paradigm based on the concept of “objects”, which can contain data, in the form of fields (often known as attributes or properties), and code, in the form of procedures (often known as methods). A feature of objects is that an object’s procedures can access and often modify the data fields of the object with which they are associated (objects have a notion of “this” or “self”). In OOP, computer programs are designed by making them out of objects that interact with one another. OOP languages are diverse, but the most popular ones are class-based, meaning that objects are instances of classes, which also determine their types.

OOP编程范式基于“对象”的概念,对象可以包含数据(以字段的形式,通常称为属性或属性)和代码(以过程的形式,通常称为方法)。对象的一个特征是,对象的过程可以访问并经常修改它们所关联的对象的数据字段(对象具有“this”或“self”的概念)。在OOP中,计算机程序是通过使它们相互交互的对象来设计的。OOP语言是多样化的,但最流行的是基于类的,这意味着对象是类的实例,类也决定了它们的类型。

在翻译和抄书之后,我们来看看面向对象编程对于F#来说意味着什么。

基于对象的编程

我一直倾向于把编程分为两类。

一类是应用程序员,实际上不是什么程序员,我就是典型这类程序员,我们不产生库,我们只是库的搬运工。我们所运用的面向对象编程技术,实际上是基于对象的编程(Object-based programming,OBP)。OBP也有几个层级。

  1. 我们创建一些对象,设置对象的状态,调用对象的方法,获得对象的输出,问题解决;
  2. 我们创建一些对象,把他们组合在一起,把各个对象的状态设定为特定状态,让对象们相互交换信息,最终获得我们想要的输出,问题解决;
  3. 我们创建一些对象,但是通过继承和多态,略微修改对象的行为,使之更加符合我们需要解决的问题,获得我们想要的结果,问题解决。

这种调用库、组合库和补充库的三大手段,就是OBP的全部内容。也是很多人(包括我)获得工资的全部内容。

说真的,我们这种搬库工,实际上比CRUD还是要难一点的……

要完成基于对象的编程,我们实际上需要解决面向对象编程的三个问题。

  1. 创建;
  2. 组合;
  3. 继承与多态。

与更加高端的程序员不同,我们需要掌握的不是这些技术的实现细节,而是需要掌握这些技术的外在表现。而要实现好用、可靠的对象库,则需要更加高端的程序员——API程序员,真正掌握面向对象编程的高端人员。

面向对象的编程

真正高端的面向对象程序员的工作主要有两个方面:

  1. 设计对象体系结构;
  2. 实现便于调用的API。

这两个问题,第一个问题与问题域非常相关,也是一般情况下高端C++程序员总是在很小的范围内工作,因为领域专家很贵,领域知识很难获得,大部分需要很强的资金支持和长期的实践机会。

这是面向对象编程的一个核心内容,识别领域中的对象,构建领域对象的抽象观念模型,充分考虑领域可能产生的变化。准确的说是要把领域中的固定结构和变动分离开,并设计可靠的拓扑结构来容纳变动。

变与不变,是面向对象编程中领域分析的核心问题。

第二个问题就是具体编程技术,就是那些我完全学不会的、用于支持面向对象库的API设计技术。我既然没学会,那就没啥好说的……

让大佬们操心这个问题吧,等自己够厉害了才去搞这个问题。所以我的观点就是,对比较普通的面向工资编程的程序员而言:1)别搞什么设计设计模式;2)别搞什么面向对象编程;3)别搞什么API设计。

当然,生计问题解决的情况下、视自己的天分而定搞点更高端的那是必须的。但是这部分人会来看我们知乎吗……我很怀疑……

F#中的基于对象编程

F#对于.NET体系中的对象技术有完全的支持。F#中的对象,可以直接使用C#中的对象,也可以直接被C#中的对象使用。简直是完美。就好比Kotlin与Java,这两者的对象模型是完全兼容的。而Clojure、Scala与Java的对象模型兼容性就不是那么完美。

创建对象

F#中创建对象的语法是这样的:

let obj = new ClassName()

有些时候,我们需要给对象的构造函数传递参数,这时候就需要使用下面的语法:

let obj = new ClassName(param1, param2)

另外,如果对象定义了属性(Property),我们可以使用下面的语法来在创建对象是设置属性:

let obj = new ClassName(prop1 = value1, prop2 = value2)

调用对象的方法

F#中调用对象的方法,使用的是和C#一样的语法:

obj.MethodName(param1, param2)

访问对象的属性

F#中访问对象的属性,使用的是和C#一样的语法:

obj.PropertyName

继承与多态

F#中的继承与多态,语义上跟.NET体系中完全一样,语法上有一点点甜:

type DerivedClass() =
    inherit BaseClass()
    override this.MethodName(param1, param2) =
        // do something

接口

F#中的接口,语义上跟.NET体系中完全一样,语法上有一点点甜:

type DerivedClass() = 
    interface IInterfaceName with
        member this.MethodName(param1, param2) =
            // do something

扩展对象

除了上述标准的基于对象的技术,F#还提供了扩展对象的语法糖。

type ClassName with
    member this.MethodName(param1, param2) =
        // do something
    member this.PropertyName 
        with get() = // do something
        and set(value) = // do something

相当甜。

总结

  1. 面向对象编程有两个层次,基于对象编程和面向对象编程;
  2. F#完美支持.NET体系中的基于对象编程技术。
posted @ 2023-07-21 08:45  大福是小强  阅读(13)  评论(0编辑  收藏  举报  来源