用java有理数类包含加减乘除,7.1 面向对象的简介 - VimL 语言编程指北路

2023-11-15

面向对象是一种编程思想,并不特指某种编程语言。所以不必惊讶用 VimL 也能以面向

对象的方式来写代码。本章先简单介绍一下面向对象的编程思想,再探讨如何利用 VimL

现有的特性实现面向对象编程。最后应由用户自行决定是否有必要使用面向对象的风格来

写 VimL 脚本。

7.1 面向对象的简介

在前文中用了比较多的篇幅来介绍函数。如果主要以函数作为基本单元来组织程序(脚本)

代码,函数间的相互调用通过参数传递数据,这种方式或可称之为面向过程的编程。大部

分简单的 VimL 脚本都可以通过这种方式实现。单元函数的定义与复用也算简洁。

但是,如果有更大的野心,想用 VimL 实现较为复杂的功能时,只采用以上基于函数的面

向过程编程方式,可能会遇到一些闹心的事情。比如函数参数过多,需要特别小心各参数

的意义与次序,或许还可能不可避免要定义相当多的全局变量。当然,这可能并不至于影

响程序的功能实现,主要还是对程序员维护代码造成困扰,增加程序维护与复用的困难。

这时,就可考虑面向对象的编程方式。其核心思想是数据与函数的整合与统一,以更接近

人的思维方式去写代码与管理代码。

面向对象的基本特征

按一些资料的说法,面向对象包含以下四个基本特征:

抽象

封装

继承

多态

严格说来,任何编程都应该从抽象开始。分析现实需求问题的主要关系,归纳出功能单元

组成部分。按面向过程编程方式设计函数时,同样也需求程序员的抽象能力。所以也有些

教程资料说面向对象的基本特征是后面这三个:封装、继承与多态。这又涉及面向对象的

另一个关键概念,类。

类就是将现实诸问题抽象后的封装结果。它包括数据以及操作这些数据的方法,从概念及

表现上将这两部分放在一起视为一个整体,就称之为封装。类往往对应着现实世界的某种

类型的实体或动作。我们一般只用关注某类物事的表面接口,而不必关心其内部构造细节

。反映到程序上,类的封装就是为了隐藏实现,简化用法,一般用户只要理解某个类是什

么或像什么,以及能做什么,则不用深究怎么做。

所以在程序中,类不外是一种可自定义的复杂类型。与之相对应的简单类型就是如数字、

字符串这种在大多数语言都内置支持的。简单类型除了可以用值表示一种意义外,还支持

特定的操作,如数字的加减乘除,字符串的联连、分割、匹配等。类也一样,它用于表示

值的就是被封装(可能多个)数据,也常被称为成员属性,它所支持的操作方法也叫成员

函数。而对象与类的关系,也正如变量与类型的关系。对象是属于某个类的,有时称其为

实例变量。

有些语言的面向对象还对类的封装进行了严格的控制,比如从外部访问对象只能通过类提

供的所谓公有方法(属性),而另外一些私有方法(属性)只能在类内部的实现中使用。

继承是为了拓展封装之后的类代码的复用,将一个类的功能当作一个整体复用到另一个相

关的类中。这也是对现实世界中具有某种从属关系的事件的一种抽象。在被继承与继承的

两端,一般称之为基类与派生类,或通俗点叫父类与子类。子类继承了父类的大部分属性

与方法(具体的语言或由于访问权限另有细节控制),因而可以像操作父类一样操作子类

多态是为了进一步完善继承的用途而伴生的一个功能实现概念,使得在一簇继承体系中,

诸派生类各具个性的同时,也保留共性的方法访问接口。即向许多对象发送相同的消息使

其执行某个操作,各对象能依据其类型作不同的响应(功能实现)。

面向对象示例分析

先举个概念上的例子。就比如数字,仅管很多语言把数字当作简单的内置类型来处理,却

也不妨用类与对象的角度来思考这个已经被数学抽象过的概念。

我们知道数字有很多种:整数、实数、有理数、复数等。每种数都可以抽象为一个类,还

可以在这之上再抽象出一种虚拟的“数字”类,当作这些数类的统一基类。这些类簇之间就

形成了一个继承体系。凡是数字都有一些通用方法,比如说加法操作。用户使用时,只需

对一个数字调用加法操作,而不必关心其是哪类数,每类数会按它自己的方式相加(如有

理数的相加与复数的相加就有显著不同)。这就是使用上的多态意义。整数一般可以用少

数几个字节(四或八字节)来表示,但如果有时要用到非常大的整数,可能需要单独再定

义一个无限制的大整数类。但对一般用户来说,也不必关心大整数在底层如何表示,只需

按普通小整数一样使用即可,这就是封装的便利性。

再举个切近 Vim 主题的例子。Vim 是文本编辑器,它主要处理的业务就是纯文本文件。

那么就不妨将文本文件抽象为一个类。其实从操作系统的角度讲,文件包括文本文件与二

进制文件,若按“一切皆文件”的 linux 思想,其他许多设备也算文件。然而,以 Vim 的

功能目的而言,可不必关心这些可扩大化的概念,就从它能处理的文本文件作为抽象的开

始吧。

Vim 将它能编辑的文件分为许多文件类型,典型的就如各种编程语言的源代码文件。于是

每种文件类型都可视为文本文件这个“基类”的“派生类”。然后,Vim 所关注的只是编辑源

码,并不能编译源码,它只能处理表面上的语法(或文法)用于着色、缩进、折叠等美化

显示或格式化的工作。所以不妨再把一些“语法类似”的语言再归为同一类,比如 C/C++、

java、C#、javascript 等(都以大括号作为层次定界符),就可以在其上再抽象一个

C-Family 的基类,它处于最基本的文本文件之下,而在各具体的文件类型之上。显然

,类的抽象与设计,是与特定的功能目标有关的。若在其他场合,将 C++、java、

javascript 等傻傻分不清混为一谈就可能不适合了。

若再继续分析,C 语言与 C++ 语言还算是不同的语言,总有些细节差异需要注意,尤其

是人为规定的源码编程风格问题。至于是否真要再细分为两个类,那得看需求的权衡了。

另外,C/C++ 语言还有个特别的东西,它要分为头文件与实现文件。这也得看需求是否要

再划分为两个类设计。如果在编写 C/C++ 代码时需要经常在头文件声明与实现文件的实

现时来回跳转,甚至想保持实现文件的顺序与头文件声明一致以便于对照阅读,那么再继

承两个类分别设计或许是有意义的呢。

对所有这些语言源码文件,Vim 都提供了一个缩进重格式化的功能(即 = 命令)。只

要为每个类实现重缩进的操作(实际上利用了继承后,也只要在那些有差异需求文件类型

上额外处理),就可以让 Vim 用统一的一键命令完成这个工作了。这就相当于多态带来

的便利。

当然了,以上的举例,只是概念上的虚拟示例。Vim 编程器本身是用 C 语言写的,并没

有用到面向对象的方式,因而也不会为文件类型设计什么类。而且既然它主要是为处理文

本,VimL 也只要处理简单的整数与实数(浮点数)即可,不会去设计其他复杂的数字类

。这主要是说明如何采用面向对象的思想分析问题,提供一种思路与角度,顺便结合示例

再说明下面向对象的几个特征。

面向对象的优劣提示

上文介绍了面向对象的特征,由此带来代码易维护易管理的优点。同时上面的例子也说明

面向对象并不是必要,不用面向对象也能做出很好的应用产品。

其实,面向对象主要不是针对程序,而是针对程序员而言的。如果简单功能,单人维护,

尤其是一次性功能,基本就不必涉及面向对象,因为要实现对象的封装会增加许多复杂代

码。面向对象适合的是复杂需求,尤其涉及多人协作或需要长期维护的项目。此外,在实

际使用面向对象编程时,也要注意避免类的过度设计,增加不必要复杂度。

本章剩下的内容旨在探讨如何使用 VimL 实现基本的面向对象。从学习的角度而言,也可

据此更深入地了解 VimL 的语言特性。至于在实践中,开发什么样的 Vim 功能插件值得

使用面向对象编程,那就看个人的需求分析与习惯喜好了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用java有理数类包含加减乘除,7.1 面向对象的简介 - VimL 语言编程指北路 的相关文章

  • 微信小程序介绍

    目录 1 什么是小程序 2 小程序可以干什么 2 1 相关资料 2 2 申请微信小程序测试账号 3 开发一个demo 3 1 创建项目 3 2 配置 3 3 常用框架 3 4 目录结构说明 目录结构 小程序代码构成 JSON 配置 小程序配
  • el-table 列里面嵌套 el-table

    一 达到的效果如下图 二 实现流程 2
  • 强大而精致的机器学习调参方法:贝叶斯优化

    一 简介 贝叶斯优化用于机器学习调参由J Snoek 2012 提出 主要思想是 给定优化的目标函数 广义的函数 只需指定输入和输出即可 无需知道内部结构以及数学性质 通过不断地添加样本点来更新目标函数的后验分布 高斯过程 直到后验分布基本
  • spring boot之actuator健康检查

    什么是actuator SpringBoot自带监控功能Actuator 可以帮助实现对程序内部运行情况监控 比如监控状况 Bean加载情况 环境变量 日志信息 线程信息等 官翻文档 https blog csdn net alinyua
  • java实体类相互转换

    工具类 public class SmartBeanUtil 复制bean的属性 param source 源 要复制的对象 param target 目标 复制到此对象 public static void copyProperties
  • dataframe多种更改数据的方法

    以下是测试的数据 import pandas as pd data name Alice Bob Cindy David age 25 23 28 24 gender woman man woman man df pd DataFrame
  • 人工智能目标检测数据集:飞机(3)

    本数据集为飞机卫星图 包括J用 民用 以及通用飞机 图片数量1000张 图片尺寸为1024x1024 RGB彩图 仅包含一类目标 飞机 数据集已经打好标签 标签格式为常用的pascal voc格式 xml 可以直接用于目标检测模型的训练 Y
  • 如何快速求最大公约数和最小公倍数

    可以运用辗转相除法 即 326 78 78 326 78 78 14 14 78 14 14 8 8 14 8 8 6 6 8 6 6 2 2 6 2 0 此时结束 这个时候2就是最大公约数 所用原理是 1 a b a ka b 其中a b
  • 正则表达式函数

    匹配函数 match函数是从头开始匹配 如果刚开始匹配不成 就无法再进行匹配了 import re result re match r a zA Z 大Abc print result 输出结果 None search函数 只要字符串中有满
  • vue和ajax

    常用发送ajax的方法 xhr jQury get post axios fetch window内置 promise风格 会把返回数据包两层promise 而且兼容不好 v resouce server1 js const express
  • java获取文件夹下所有图片_【windows技巧】快速获取文件夹内所有文件名称列表...

    转自 百度经验 https jingyan baidu com article 3aed632e3917c870108091d1 html 1 打开一个文件夹 gt 2 新建一个TXT文档 将名字命名为 文档列表 gt 3 在TXT文档里输
  • c++什么时候生成默认拷贝构造函数

    需要默认拷贝构造函数原因 如果不提供默认拷贝构造函数 编译器会按照位拷贝进行拷贝 位拷贝指的是按字节进行拷贝 有些时候位拷贝出现的不是我们预期的行为 会取消一些特性 以下是需要默认拷贝构造函数的必要条件 1 类成员也是一个类 该成员类有拷贝
  • 如何实现无线网卡上外网+有线上内网=同时上网

    网上那些花里胡哨的 一顿操作然并卵 已补充成功操作详情 请翻到最后面查看 前面内容请忽视 至少我现在根本实现不了 但是会比拔插网线换来换去方便些 记录下 需要的自取 实例 一 开始 1 管理员打开cmd命令 2 route print 查看
  • chatgpt赋能python:怎么让Python执行完不关闭的SEO

    怎么让Python执行完不关闭的SEO 作为一名有十年Python编程经验的工程师 我深知Python在SEO技术中的重要性 然而 很多人可能不知道如何让Python执行完任务后不关闭 这将会影响我们的SEO效果 因此 在这篇文章中 我将向
  • xlwt:ValueError: column index (256) not an int in range(256)

    xlwt最大列只支持255列 超过范围会报错 可以考虑用xlsxwriter
  • 安卓已死?毕业一年萌新的Android大厂面经,年薪超过80万!

    前言 最近我一直在面试高级工程师 不管初级 高级 程序员 我想面试前 大家刷题一定是是少不了吧 我也一样 我在网上找了很多面试题来看 最近又赶上跳槽的高峰期 好多粉丝 都问我要有没有最新面试题 索性 我就把我看过的和我面试中的真题 及答案都
  • layer.msg 的time 时间停留问题

    layer msg 同上 icon 1 time 2000 2秒关闭 如果不配置 默认是3秒 function do something time 属性为弹框停留时间 单位为毫秒 tipsMore 属性为是否同时显示多个弹框 true为显示
  • 顺序表与数组

    顺序表是在计算机内存中以数组的形式保存的线性表 顺序表是指用一组地址连续的存储单元依次存储数据元素的线性结构 线性表采用顺序存储的方式存储就称之为顺序表 顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中 线性表采用指针链接

随机推荐

  • Python 如何将字符串转为字典

    在工作中遇到一个小问题 需要将一个 python 的字符串转为字典 比如字符串 user info name john gender male age 28 我们想把它转为下面的字典 user dict name john gender m
  • Kubespray-offline v2.21.0-1 下载 Kubespray v2.22.1 离线部署 kubernetes v1.25.6

    文章目录 1 目标 2 预备条件 3 vcenter 创建虚拟机 4 系统初始化 4 1 配置网卡 4 2 配置主机名 4 3 内核参数 5 打快照 6 安装 git 7 配置科学 8 安装 docker 9 下载介质 9 1 下载安装 d
  • Linux文件编程常用函数详解——exit()和_exit()函数

    两个函数的区别
  • MongoDB未授权访问漏洞复现及加固

    说明 仅供技术学习交流 请勿用于非法行为 否则后果自负 0x01 漏洞简述 MongoDB是一个介于关系数据库和非关系数据库之间的产品 是非关系数据库当中功能最丰富 最像关系数据库的 它支持的数据结构非常松散 是类似json的bson格式
  • K8s Pod 控制器(一)

    K8s workload architecture 一 RC RS 控制器 控制Pod 使Pod拥有自愈 多副本 扩缩容的能力 RC的定义包括如下几个部分 1 Pod期待的副本数 replicas 2 用于筛选目标Pod的Label Sel
  • vscode常用快捷键使用

    Ctrl K S 全部保存 Save All Ctrl S 保存 Save ctrl f 搜索 alt 方向键右 跳转到定义 F12 转到定义 Go to Definition alt 方向键左 返回跳转 F1 或 Ctrl Shift P
  • 【华为OD机试真题 python】最大平分数组【2022 Q4

    题目描述 最大平分数组 给定一个数组nums 可以将元素分为若干个组 使得每组和相等 求出满足条件的所有分组中 最大的平分组个数 输入描述 第一行输入 m 接着输入m个数 表示此数组 数据范围 1 lt M lt 50 1 lt nums
  • 漫画:什么是中台?

    没有中台的时代 在传统IT企业 项目的物理结构是什么样的呢 无论项目内部的如何复杂 都可分为 前台 和 后台 这两部分 什么是前台 首先 这里所说的 前台 和 前端 并不是一回事 所谓前台即包括各种和用户直接交互的界面 比如web页面 手机
  • CH1-Android基础入门

    文章目录 目标 一 资源的管理与使用 1 1 图片资源 1 2 主题和样式资源 1 3 布局资源 1 4 字符串资源 1 5 颜色资源 定义颜色值 1 6 尺寸资源 Android支持的尺寸单位 二 程序调试 2 1 单元测试 2 2 注意
  • hive中解决中文乱码

    一 个人初始开发环境的基本情况以及Hive元数据库说明 hive的元数据库改成了mysql 安装完mysql之后也没有进行其它别的设置 hive site xml中设置元数据库对应的配置为 jdbc mysql crxy99 3306 hi
  • Vue使用高德地图搜索功能

    下载依赖 yarn add amap amap jsapi loader 2 初始化高德地图 设置key和秘钥
  • Python numpy练习,纯英文ipynb作业26题,100%正确答案(付费)

    md Assigment 2 Instructions This problem set should be done individually Answer each question in the designated space be
  • njx如何实现负载均衡_LVS + keepalived + nginx + tomcat 实现主从热备 + 负载均衡

    前言 首先声明下 由于这两天找资料 看了不少博客 但是出于不细心 参考者的博客地址没有记录下来 所有文中要是出现了与大家博客相同的地方 那么请大家在评论区说明并附上博客地址 我好引用进来 这里表示抱歉了 另外 本文是在我的另一篇博客主从热备
  • element-ui渲染el-table表格小技巧

    element ui中table的使用 当el table元素中注入data对象数组后 在el table column中用prop属性来对应对象中的键名即可填入数据 用label属性来定义表格的列名 可以使用width属性来定义列宽 相当
  • Qt 多项目系统中如何指定各项目的编译顺序 (***笔记)

    QT学习笔记 QT多项目系统中如何指定各项目的编译顺序 Qt pri 创建使用 pri文件 Qt pro文件 pri文件的写法 Qt 多项目系统中如何指定各项目的编译顺序 笔记 https blog csdn net ken2232 art
  • 目标跟踪算法——KCF入门详解

    一直以来没有很想写这个 以为这个东西比较简单 还算是比较容易理解的一个算法 但是在知乎上回答过一个问题之后就有朋友私信我一些关于细节的东西 我一直以为关于细节的东西大家可以自己去理解 大家都是想快速了解这个 那我就厚脸皮了在这写一下自己的见
  • 场景二:Git远程版本库的基本用法

    1 克隆远程版本库 如果你已经在Gitee或者GitHub等网站上创建了Git版本库 可以通过git clone命令 将版本库克隆到本地完成本地版本库的初始化 git clone命令的用法如下 git clone https DOMAIN
  • 由羽毛球拍想到的

    羽毛球拍 品牌太多 如何选择 看到红双喜厂商的具体套路 才知这个市场与手机市场一样 都是低端的外包 高端的自己做 但是 球拍这个东西高端的和低端的普通人能看出区别 许多生活中的产品都是如此 例如空调 格力之类的空调压缩机许多也是采购第三方的
  • Python之花舞盛宴:探索列表与元组之美与妙用

    前言 在Python编程世界中 列表和元组是两个最常用的数据结构之一 无论是初学者还是经验丰富的开发者 对于这两个数据类型的掌握都至关重要 列表和元组都是用于存储多个值的容器 但它们在性质和特性上有所不同 列表是可变的 可以随意修改 添加或
  • 用java有理数类包含加减乘除,7.1 面向对象的简介 - VimL 语言编程指北路

    面向对象是一种编程思想 并不特指某种编程语言 所以不必惊讶用 VimL 也能以面向 对象的方式来写代码 本章先简单介绍一下面向对象的编程思想 再探讨如何利用 VimL 现有的特性实现面向对象编程 最后应由用户自行决定是否有必要使用面向对象的