如何写出不太坏的代码

2019-02-28

如何写出不太坏的代码

本来想把标题定为“如何写出好代码”的,但是转念一想,觉得自己没那么牛逼,就改成了不太坏的代码。只要不要写出太糟糕的代码,不就是好代码了吗?

以下只是个人的一些总结,如有异议,请出门右转。

1.注重命名

包括文件名,变量名,方法名。一般变量名以功能来命名,看它的名字就能知道它的用途是什么 遵循一些命名规范。Java中成员变量名一般以m开头,而OC中的成员变量一般以_开头

2.遵循低耦合,高内聚的原则编写代码

具体表现遵循分层分模块原则,底层模块不能依赖上层模块,逻辑层不依赖界面,绝不要把逻辑层代码和界面代码混在一起

3.针对接口编程,而不是实现编程

当一个类要暴露一些方法给外部调用或者通信时,先定义好接口。接口定义应该简单明了,不容易引起歧义,接口尽量少。最后才考虑内部实现,而且尽量不暴露给外部,尽量不需要外部知道内部是如何实现的

4.一个类的代码量尽量不要太大,一个方法只做一件事情

一个类(或者一个方法)的代码越多,出错的概率越大。一个类三到5百行代码最佳。如果一个类的代码太多,就要考虑这个类是不是做的东西太多了 ...

Category: 技术 Tagged: iOS开发 Android开发

comments

Read More

2018年总结和2019年展望

2019-02-10

2018年总结和2019年展望

一直都没写,不愿意动手,明天就要新的一年上班了,所以还是简单写写吧。

2018年总结

1.上半年过得很不好,一直非常焦虑,公司发展不好,心里很慌,害怕倒闭了被动找工作。后面决定满一年后就换工作,但是一直没找到合适的。在年中的时候一度非常焦虑,很长一段时间没碰过香烟了,因为心情太过焦虑,又开始在公司偶尔抽了起来。直到后面我在那个公司满一年后,真正决定开始找新工作,找到了一个自己比较合适的公司,心才定下来。

2.下班年去了新公司后很忙,每天都在马不停蹄的赶,提供工作效率,但是并不觉得很累。很久没有这种感觉了。终于找到跟自己比较匹配的工作,也能比较大的发挥自己才能的工作。老板的价值观,直接上级的价值观跟自己都比较契合,公司的文化也挺好。真心希望能在这家公司发挥自己的才能,也希望公司能做大做强。

2019年展望

2019年还是希望工作上能继续发挥能量,希望自己的技术能力和管理能力都能得到提升,还有希望自己的团队的每个人的能力都得到提升,当然也希望他们能得到相应的报酬。

2019年有两件大事。

1.新房装修。一是要找钱装修,二是要在年底前装修完,希望能在农历年前住进去。新房装修是个大工程,自己完全没有经验,所以要多花点心思。

2 ...

Category: 生活 Tagged: 总结

comments

Read More

iOS开发如何做外部测试

2019-01-05

iOS开发如何做外部测试

我们做APP开发的,开发出来的APP还未上线,又要想给别人用一下,该怎么做?实际上这是我们每个做APP开发的人都会遇到的,但是并不是每个人都清楚怎么做,有哪些方式。今天我们就来讲一讲。

在将iOS的APP如何给别人使用和测试前,先说一下安卓APP开发是怎么做的。安卓端是很简单的,你只要先生成一个证书文件keystone,然后用这个文件给apk签名,就可以将apk发给任意一个人安装使用了。这很简单,也很方便。可是iOS的就没那么容易了。我们还是从最简单的开发人员如何用真机测试开始说起。

真机调试

我们有了一个想法,并开始写代码,模拟器调试很方便,要在iPhone上看效果怎么办了。你直接将iPhone连上电脑是不行的。现在的情况至少你需要一个Apple ID,在Xcode上登录你的账号,在调试前Xcode会自动帮你初始化一些东西,然后就可以将APP安装到你的iPhone上了。在以前,你这个AppleID不能是普通的账号,必须是付了前的开发者账号才行。现在苹果放宽限制了。

这种方式的做法是你的手机必须连上你的电脑,在Xcode上选择你的iPhone来调试,Xcode会自动帮你注册设备的UDID。如果你没办法把iPhone连接到电脑上呢?或者不方便把iPhone连接到电脑上,毕竟如果是老板的手机的话,不方便那种做的。那我们需要一种把安装包提供给别人安装,或者一个地址给别人安装的方式。

adhoc 方式

我们将项目archive后,在导出(现在Xcode叫distribution)的时候,有个选项是adhoc ...

Category: 技术 Tagged: iOS开发 beta测试 TestFlight 公开链接

comments

Read More

SVG图片在移动端的应用解决方案

2018-11-03

SVG图片在移动端的应用解决方案

近几年来SVG使用得越来越多,就连Android的官方库也加入VectorDrawable的支持。这个类就是用来支持向量图的。SVG图片在web端使用非常广泛,我第一次接触这个也是在做react-native的项目中使用的。当时我们要做一些动画,需要从一个形状变换成另一个形状,这种一般都是用矢量图来做的。当时设计师就给了我一些矢量图,于是我就开始研究这个东西。

在react-native中,有专门一个库叫react-native-svg来处理这个。不过当时要做两个SVG形状的动画变化,并不是任何一个形状都可以的,需要遵循一定的标准。设计师给我的两个SVG文件并不能转换。后来是我自己根据文件里的一些关键参数自己在代码里直接画出来后,再做转换动画。

最近我在做的native项目中,也遇到了要用SVG的图片。我们的项目里要从服务器下载SVG图片来展示。我们要实现的这些文件是需要服务器动态配置的,也就是说我们不能预先打包进我们的APP里。所以我们这里的要提供一个解决方案,跟图片JPG图片一样显示,缓存。

这个需求跟之前我遇到的那个需求是很不一样的,之前的是设计师已经定义好图片,我们工程师直接拿到文件在程序里展示,不需要考虑下载和缓存之类的。这种需求其实很简单,我们实际上大部分的需求就是这种需求,网上有很多库可以完成这种需求。把SVG图片跟JPG等普通图片一样使用,网上的方案还真不多,特别是iOS方面。。。。

要像普通图片一样使用,就要考虑下载,本地缓存,内存缓存。像这种需求,我们移动端都会使用专门的图片框架,像安卓端的glide,UIL等,iOS端的SDWebImage等。但是这种库它是默认都不会考虑SVG图片。但是我们最好还是像使用这种框架来处理SVG图片 ...

Category: 技术 Tagged: 算法 SVG androidsvg glide Macaw

comments

Read More

谈谈归并排序算法

2018-08-06

谈谈归并排序算法

归并排序算法是一个很重要的算法。在排序算法中,算是非常重要的一个算法。我们常说的数组归并排序,是指二路归并排序算法,时间复杂度是O(nlog(n)),空间负责度是O(n).核心的思想就是对两个有序数组合并成一个有序数组。对于一个未排序的数组怎么产生两个已排序的数组呢?其实就是对数组不断的分割,分割成多个只有一个元素的数组。只有一个元素的数组,当然这个数组就是有序的了。然后再将这些数组进行两两合并,合并后的数组还是有序数组,这样再次进行两两合并,最终可以合并成一个有序数组,这样排序就完成了。

归并排序的算法看起来不是很复杂,但是实现起来我觉得不是那么简单。首先它需要额外的空间,这个额外的空间怎么分配跟算法实现方式有关。然后算法的实现方式有递归方式和迭代方式两种。网上流行的都是递归方式。

递归方式

递归方式采用典型算法:分治法来进行。

  • 1.将数组分为两半,前一半和后一半。
  • 2.将这两半进行有序数组合并
  • 3.继续进行第1步,直到数组不能在分为止

这里明显采用了递归定义,递归定义其实不是那么好理解,也不是那么难理解。简单来说就是不断的将一个数组进行对半分,一直分到不能分为止,这样最终就会分得很多个元素个数为1的数组,然后再将这些数组进行两两合并。注意子数组可能是奇数个,但是这也没关系,没得合并的就暂时放在原位,下一次合并的时候总会用到 ...

Category: 算法 Tagged: 算法 归并排序

comments

Read More

中国互联网群体跟几年前发生了巨大变化

2018-08-04

中国互联网群体跟几年前发生了巨大变化

抖音和拼多多

今天晚上刷着刷着抖音的时候,我突然意识到现在的互联网跟几年前的互联网已经发生了巨大的变化。这个变化其实很在就开始,也很早有人提过了。但是我自己也是刚刚才深刻的意识到这一点。

我在抖音上只关注了几个人,这些人都基本上是在农村或者小城市生活的。然后联想到最近吵得的很火的拼多多的用户群体,还有更早的快手,现在很火的应用的主要用户群体,都是以小城市和农村的用户为主。所以我突然意识到,现在已经不是以前那个以社会白领用户或者高端用户为主的互联网了。如果现在要做纯互联网的应用,就要考虑“低端”用户为主了,可以说得小城市或者农村的用户得天下了。

你看拼多多,3年就上市了,市值超过200亿美金,号称有3亿用户。而抖音估值也不低于100亿美金。拼多多被很多都市白领吐槽质量差假货多,殊不知人家的主要用户就不是你们。而抖音上很多内容都是三四线城市的人或者农村人发的。我估计抖音后台应该很清楚,抖音的发布内容主要用户应该是三四线以外的用户群体。为什么会这样子,我想在我说我的想法之前先说说别的。

我自己最常用的几个应用是微信,微博,雪球,还有知乎等一些跟自己专业相关的社区应用。微信是通信工具没的说,但是里面的公众号内容其实主要是给社会精英,白领消费的。微博,典型的社会精英和媒体社交平台。知乎,大部分也是社会白领在上。这就是我们以前开发互联网应用的主要目标用户群体。

你看,我们一致性的忽略了“低端”用户。其实不是我们故意的,而且以前这些用户不存在或者没有消费能力 ...

Category: 生活 Tagged: 互联网

comments

Read More

多家公司的人证比对算法体验和开发感想

2018-07-13

多家公司的人证比对算法体验和开发感想

最近在开发一个声纹采集一体机系统,这个系统里用到了人证比对功能,即刷身份证后拍照,然后将身份证里面的照片跟拍照比对,验证是否是同一个人。我们不是做人脸识别的公司,所以人脸识别功能当然是接入别人的SDK,这里我们找了好多家的人脸算法,对接过程中也遇到很多问题。经过这次的开发,我了解到这个行业的一些现状。

我们的系统主要运行在Windows电脑上,而且需要无网络也能使用,所以人脸算法必须是用离线版的。人脸算法厂家一般对外提供两种方式:在线版和离线版。一般在线版都可以提供免费试用,离线版需要授权使用。

云端方案

在线版的人脸识别我试用过依图科技的和中科视拓的SDK。在我们的应用声临其境APP上有个声纹购物的场景,需要人脸验证。这两个厂家提供的API都差不多,依图的API安全性考虑更全面,错误码定义的比较详细。还有他们的API共同点是,图片传输都是将图片数据进行base64编码后传输的。至于准确率,感觉都差不多,没有特别明显的差距。

离线方案

离线版的人脸算法用得比对多。因为它是用在我们要卖的机器上,而在线版的我们只是做试验。离线版的集成和使用要比在线版麻烦很多。由于离线版要给出算法库,处于安全和容易被拷贝的原因,都是要先授权的。授权的方式一般有两种:在设备上接入加密狗USB key或者绑定设备机器码的方式。加密狗方式比较方便,我们一般采用这种方式。

我们接入了很多厂家,有阅面科技,中控,杰锐达,商汤,我还把开源的dlib人脸识别也接入了 ...

Category: 技术 Tagged: 人脸检测 人证比对 dlib electron

comments

Read More

Flutter框架研究和与RN对比

2018-03-16

Flutter是什么

现在技术更新迭代真的很快,每隔几年就会出现一些新的技术。当然,Flutter出现有有一点时间了,只不过还未真是发布,但是已经有一些人在使用了。这篇文章主要内容来自我在公司内部的一次分享会,所以大部分内容都是提炼。

  • Flutter 是由 Google 的工程师团队打造的,用于创建高性能、跨平台的移动应用的框架。
  • Flutter 针对当下以及未来的移动设备进行优化,专注于 Android and iOS 低延迟的输入和高帧率
  • Flutter的设计跟react-native很像,但是比RN进了一步
  • Flutter的开发语言是Dart

移动端跨平台开发技术演进

现在主流的移动开发平台是Android和iOS,之前还有过windows phone,每个平台的开发技术都不太一样。大家都是针对每个平台开发应用。自然有人就会觉得这样效率低下,想进行跨平台开发。从最开始的Hybrid混合开发技术,到RN的桥接技术,到现在新兴的Flutter技术,跨平台开发技术一直在演进。

以往最早的Hybrid开发,主要依赖于WebView。但是WebView是一个很重的控件,很容易产生内存问题,而且复杂的UI在WebView上显示的性能不好。react-native技术抛开了WebView,利用JavaScriptCore来做桥接,将js调用转为native调用,只牺牲了小部分性能获取的跨平台开发,这是一大进步。所以现在react-native很流行的原因。

react-native原理图

上图react-native框架原理

Flutter实现跨平台采用了更为彻底的方案 ...

Category: 技术 Tagged: ReactNative Flutter

comments

Read More

Jenkins slave ReactNative项目自动打包

2018-03-08

Jenkins slave ReactNative项目自动打包

这次我想在谈谈Jenkins自动打包的问题。针对react-native项目。 一般情况下,我们都是在一台电脑上安装Jenkins,然后在该电脑上打开Jenkins网页进行打包配置。如果我们有很多项目,分布在不同的电脑,而且运行的系统也不同,这时候我们需要一个master来统一管理这些电脑,然后统一在一个网页上进行打包配置。这就是Jenkins的master-slave打包模式。这种模式跟单机模式稍有不同,这里主要讲怎么配置slave。

slave节点配置

  • 首先slave上也同样要安装Jenkins和相关的打包所依赖的环境,一个都不能少。配置好之后,我们并不需要在本机上打开Jenkins网页来创建项目,配置项目等,而是要到主机上去配置。在去主机的Jenkins管理页面上新建节点之前,从机还需要做一些其他配置。
  • 打开远程登录。在系统设置-->共享,然后选中远程登录,允许所有用户访问。
  • 记住本机IP地址。在系统设置-->网络,可以看到当前网络的IP地址。为了以后方便,可以将IP地址设置为一个固定IP地址。不然当该电脑重启之后,IP地址可能会变,然后主机再按照之前配置的旧IP连接从机的时候,就连不上了。Mac电脑配置固定IP也有注意的地方。我第一次配置就是没有成功,上不了网。选择手动方式,然后填上一个没有被占用的IP地址,然后,子网掩码也要注意,如果跟服务器是跨网段访问的,需要注意255.255 ...

Category: 技术 Tagged: ReactNative Jenkins iOS

comments

Read More

react-native框架源码学习(iOS)(下)

2018-03-02

react-native框架源码学习(iOS)(下)

如果没有看过上篇,请先看react-native框架源码学习(iOS)(上)

JSCExecutor相关初始化

在上篇中说到Instance的初始化方法initializeBridge里,最主要是创建了NativeToJsBridge的实例。而NativeToJsBridge的构造函数里,主要是调用了executorFactory来创建一个JSCExecutor。NativeToJsBridge的构造函数还包含更多的东西。

NativeToJsBridge::NativeToJsBridge(
    JSExecutorFactory* jsExecutorFactory,
    std::shared_ptr<ModuleRegistry> registry,
    std::shared_ptr<MessageQueueThread> jsQueue,
    std::shared_ptr<InstanceCallback> callback)
    : m_destroyed(std::make_shared<bool>(false))
    , m_delegate(std::make_shared<JsToNativeBridge>(registry, callback))
    , m_executor(jsExecutorFactory->createJSExecutor(m_delegate, jsQueue))
    , m_executorMessageQueueThread(std::move(jsQueue ...

Category: 技术 Tagged: ReactNative 源码 iOS

comments

Read More
Page 3 of 8

« Prev Next »