0%

前言

在面向对象领域中,方法(method)和函数(function)有什么区别和关联呢?

方法和函数的区别

在面向对象领域中,方法和函数的区别是:

  1. 定义不一样

    • 函数是指一段可以直接被其名称调用的代码块
    • 方法指的是一段被它关联的对象通过它的名字调用的代码块
  2. 与对象的关系不一样

    • 函数独立于对象
    • 方法依附在对象之上,可以在代码块内直接处理对象上的成员数据
  3. 传递的数据(比如参数)不一样

    • 传递给函数的数据都是明文明确的
    • 传递给方法的数据有部分是隐式的,其中隐式部分的数据主要是调用该方法的对象实例
  4. 可访问范围不一样

    • 一般来说(在不考虑module、package等作用域的设计情况下),函数的可访问范围是全局性的,即可以在代码的任何地方访问到
    • 方法的可访问范围由其访问修饰符决定,基本上其范围都局限在所依赖的对象内
Read more »

为何重启个人博客?

这个问题很早就想发文表达了,如今时机终于到了——在这个人博客重建完毕的时候,可以好好的来对此说说了。

重启个人博客的念头源自18年8月简书创作平台发的一则公告:

简书公告

翻阅《网络安全法》,并没有出现要求绑定“微信”的明文要求,而行业内,“网络运营者”(使用国法里的称法)的常规做法也只是要求用户绑定手机号即可——很明显地,简书这是在假借国法,浑水摸鱼,愚弄用户。

坦白而言,简书是我很喜欢的一个写作平台,它的优秀写作体验,甚至让我做了停止搭建个人博客,专注于写作本身的决定——这在当时的简书个人介绍上可见一斑:

简书个人介绍

然而,甚是没想到简书对用户如此毫无尊重和敬畏,所以在那之后,决定了迁移到掘金上进行写作。

那,既然已经有另一个平台供写作了,为何还是要重启个人博客呢?

为何“要”呢?

人生来之时是善还是恶,这无法定论。但是,人生来之后,却无法保证自身不作恶。平台是人搭建的,自是平台也无法保证自身不作恶。所以必须重启个人博客,对自己的文章进行备份,以在所寄身的写作平台在作恶之时,有路可退。

为什么Objective-C中有Class和MetaClass这种设计?

这个问题某日在掘金上看到的。我认为这不是一个技术领域的问题,而是编程语言的设计选择领域的问题。

在Objective-C编程语言的设计中,类(Class)既是一个用于描述对象实例(object)的属性和行为的工具,也是一个对象(Object),有自身的属性和行为;那类(Class)的属性和行为使用什么来描述呢?答案就是:元类(MetaClass)。只不过元类(MetaClass)处于编程语言的实现底层,对开发者是透明的。

那取消掉元类(MetaClass)可以吗?

答案是:可以。但是这需要从该编程语言的设计上做根本的调整:取消掉“类(Class)也是对象(Object)”的设计,把类(Class)同时当作描述对象实例(object)和类(Class)自身的属性和行为的工具。采用与此类似的设计的编程语言也存在,比如C++。

在产品层面,Windows与Unix/Linux的区别

在产品层面上,Windows与Unix/Linux的区别主要体现在二者服务的对象和应用场景上:

  • Windows系统的服务对象主要是(或者说优先是)个人计算机用户,主要用于为个人计算机用户提供办公(如文档编写、画图)、娱乐(上网浏览、视频播放)、沟通(IM聊天)等服务。
  • Unix/Linux系统服务对象主要是(或者说优先是)企业用户,主要为企业用户提供计算任务的服务,如网络访问服务、数据生成、数据存储等。

在人机关联层面上,,Windows与Unix/Linux的区别主要体现在二者与人和机器的关联程度上:

  • Windows系统更靠近人这一端,其优先考虑人的操作行为,并在系统设计上优先考虑适应人的操作行为,从而为人操作机器时提供良好的短时延服务
  • Unix/Linux系统更靠近机器这一端,其优先考虑的是多个计算任务的运行,然后在系统设计上优先考虑CPU运行多个计算任务的高效性,从而为客户端提供最大的数据吞吐

在桌面系统层面上,Windows是一个桌面系统,Unix/Linux则不是一个桌面系统。

Linux-VS-Windows

Read more »

Flr

前言

作为一名Flutter开发者,如果你正在烦恼如何简单快捷地在pubspec.yaml中为多张图片、文本、字体资源添加声明,如果你正在烦恼如何简单安全地在代码中引用资源,那么现在你可以很简单地解决这些问题了——只要你使用了Flr

Flr简介

Flr,读作Flutter-R,是一个由网易严选智造团队研发的,用于管理Flutter资源的开发工具。

Flr可以帮助Flutter开发者在修改项目资源后,自动为资源添加声明到pubspec.yaml以及生成r.g.dart文件。借助r.g.dart,Flutter开发者可以在代码中通过资源ID函数的方式应用资源,例如:

Read more »

前言

为减少手写实现JSON和模型类相互转换的序列化、反序列化代码,我们使用了官方推荐的json_serializable方案。

同时为了解决json_serializable方案需要手动写为模型类写from/to json的代码的问题,我们引入了代码片段的解决方案。

下面将会对该方案进行具体描述。

  • 该方案同时适用于VSCode和Android Studio;
  • 下文在描述该方案时,只介绍了VSCode端的实施步骤;
  • 在Android Studio落地该方案时,只需要把涉及VSCode端的实施对等转换为Android Studio端的实施即可:比如“为VSCode添加代码片段”转换为“为Android Studio添加代码片段”。
Read more »

背景

最近项目由于一些特殊需要,使用了git的submodules工具来引入一个子项目到主项目中。然而考虑submodules工具在团队协作开发的过程中,容易出现子项目版本不一致的问题,于是研发了git_submodule_version_checker这款工具来解决。

1、关于git的submodules工具的介绍可以点击阅读《Git 工具 - 子模块》

2、关于git的submodules工具的优缺点,有兴趣的请直接Google吧,目前网上已经很多资料了。总得来说,其最大的(可能也是唯一的)优点是:允许开发者将一个子项目的git仓库作为主项目git 仓库的子目录,并让子项目保持提交的独立;而其突出的缺点主要有以下几个:

  • 主项目仓库不记录子项目仓库的文件变动,只记录子项目仓库的commitId,在这个背景下,团队协作开发过程中容易产生子项目版本不一致的问题,具体表现如下:

    • 团队协作开发时,若有成员更新了子项目,但是你git pull后,却没有运行git submodule update --remote更新子项目本地仓库,那么你极有可能再次把旧的子项目版本信息(子项目仓库依然指向一个旧的commitId)提交至主项目
    • 团队协作开发时,若你在本地改动了子项目,并在主项目中提交并推送了子项目版本信息,但却没有推送子项目仓库上的改动,这时其他成员在拉取更新后,运行git submodule update时,会遇到“找不到所引用的子模块提交”的错误提示
      • 每次更新子项目仓库,子项目仓库都会回到游离状态,在这个背景下, 会产生的问题有:
    • 若你已经切换到指定分支,在更新后,需要手动切换分支;
    • 若你对子项目做了修改,但是忘记了提交,这时候执行更新,会导致修改被丢失;
  • 子项目仓库总是需要手动更新(不过可以通过自动化工具编写帮助解决此问题)

Read more »

前言

由于项目需要,新近实现了一个长截图库 SnapshotKit。其中,需要支持 UIWebViewWKWebView 组件生成长截图。为了实现这个特性,查阅了很多资料,同时也做了不同的新奇思路尝试,最终实现了一个新的、取巧的技术方案。

以下主要总结了在“WebView生成长截图”需求方面,“网上已有方案”和“我的全新方案”的各自实现要点和优缺点。

Read more »