网络框架重构之路plain2.0(c++23 without module) 环境
接下来本来就直接打算分享框架重构的具体环节,但重构的代码其实并没有完成太多,许多的实现细节在我心中还没有形成一个定型。由于最近回归岗位后,新的开发环境需要自己搭建,搭建的时间来说花了我整整一天的时间才勉强搞定。人们常说工欲善其事必先利其器,开发环境和工具是必不可少的,否则你会发现在接下来的过程中遇到困难的时候就会走很多弯路。虽然最后我们仍旧达到了目的,但是我们大概也会心力憔悴、得不偿失。于是我萌生了一个想法,那就是何不自己写一个脚本(该节我会分享,里面有许多有意思的写法,有兴趣的朋友可以阅读研究一下,如有错误希望不吝指正),让脚本把一切安装到位,那么自己就不会因为遗漏一些东西而挠头抓腮。而对于一个开发来说首先就是要搭建开发环境,这个其实是极其重要的,许多的书籍上对搭建开发环境都是简单几笔的带过。虽然网上有许多的资料,可是如果没有做一些系统的介绍或者相应的脚本,那么初学者或者会为此犯难不已。由于这一节开发环境可能篇幅不长,又考虑到不久后就即将迎来毕业季,因此我在这里就稍微将这个环境分为两个部分,它们分别叫做开发环境和工作环境,希望对于各位朋友有所助益。
开发环境
主开发环境
1、系统
plain因为支持跨平台,所以主要的两个操作系统是linux和windows,而linux中我选择了中小企业中常用的centos 7(centos 8 已经停止支持了,但是7还有一段时间才会停,估计之后大家可能会被迫使用centos stream)。而对于windows环境下,我选择的版本是目前比较流行的win10系统,毕竟这个系统对老的硬件兼容性强点,新的win11似乎要Intel系列的CPU在8代以后才支持。在windows下我的开发环境是直接使用Microsoft Visual Studio 2022进行开发,当然如果不喜欢它的重量级的朋友可以使用其免费的Code进行开发,不过现在Microsoft Visual Studio 2022也有个人免费版,我觉得如果想要专业一些直接使用这个重器吧,调试和各方面都支持的不错。
至于linux选择centos 7的原因,纯粹属于个人比较熟悉而已,如果有其他linux系统经验的朋友可以直接使用自己所熟悉的系统(只不过需要修改一下我的安装脚本来进行开发环境的构建,如果你已经有了成熟的环境,那么使用自己的即可)。我处在的行业中使用该系统的比较多,当然还有另一个叫ubuntu的系统,其实类linux系统的操作都大同小异,熟悉了一个系统后其他系统的差异也估计只在一些系统命令的区别(主要是包管理方面、网络、安全等等)。如果选用的是centos系统,那么你可以使用我的安装脚本,该脚本可以灵活定制编译器的版本,还有可以安装基于vim编辑器的开发环境,同时也有相应的定制镜像进行下载(制作后上传)。
2、编译器
windows上的编译器主要使用Microsoft Visual Studio 2022,所以编译器是自带的,因此在这里不做过多描述。由于要使用新的特性,因此编译器必须为最新的,随着未来的情况,编译器都应该保持最新的状态。有些人会发现如果拿老的项目使用最新的编译器就会遇到一些莫名其妙的错误,就算没有错误也会遇到很多刷屏的警告信息,这都是以前编译器版本对于不规范的代码过于宽松的原因。比如我现在这家公司的这个项目就是,拿最新的编译器的话是编译不过的,而且数不清的警告让人无从下手,所以只能使用旧的指定的编译器版本。
在《Effect C++》中Item 53: 不要轻忽编译器的警告,告诉我们不要轻易忽视编译器产生的抱怨,据我所知在google编程规范中就是将所有的警告视为错误,可见警告并非只是编译器的无理取闹,在编译器版本升级后,编译器的作者朋友们都尽可能地给出一些忠告,这样会减少程序在运行时的错误,因为有的一个小的疏忽就可能导致程序崩溃或者异常。这里我举一个简单的例子,一个函数返回Int32_t类型,但实际使用中我们使用了int16_t类型,这时候会发生什么呢?如果看过C++基础知识相关书籍的朋友不难想到,这个叫做宽到窄的转换,形象的说法可以比作原来用大桶装的东西要放到一个小桶里,如果桶里装的是水,假如大桶里的水小桶装得下还好,假如装不下呢?这时候必然有部分的水杯舍弃,在C++中就有数据截断这个概念了。这时候你使用的这个数据,就是部分数据,使用部分数据实际上往往不比越界、悬吊指针造成的灾难小。因此《Effect C++》中Item 27: 将强制转型减到最少专门列出该条目,用以说明强转带来的总总坏处,但有些时候我们不得不使用转换,比如接口设计的原因,那么我们也最好使用C++风格的转换方式(static_cast、const_cast等等)。
在plain开发中,重点在于centos系统下的开发,要使用最新的编译器我所知的有两种途径:gcc-toolset、gcc源码编译。如果你的yum源支持gcc-toolset12则直接进行安装即可,否则你可能需要使用源码安装了,关于如何进行gcc-toolset的安装,以及gcc源码编译安装网上有太多的文章了,我在这里就不在重复(如果源码安装你可以尝试使用我的安装脚本,目前这个脚本我只在centos下测试过,如果是其他系统估计需要改动才能使用)。今年的gcc 13发布后,我也即将使用最新的gcc 13,可以在gcc的git版本管理中发现gcc 13已经在开发阶段,如下图:
3、编辑器
在windows上我们可以使用其提供的强大的编译编辑一体的专业IDE,所以我在这里就不讨论这个平台了。其实编辑器的选择是靠个人的喜好做选择,并非使用某个编辑器就一定好,只要你用的顺手即可。多年前刚开始进入互联网行业的时候我开始使用的编辑器是zend studio,在此之前我在学校只接触过eclipse、VS,但eclipse我不是很喜欢,因此到现在我都不愿意使用它,这其实都是正常的事情。刚刚进入行业的时候,听说某某程序员使用记事本来进行开发,听上去很厉害,可是我觉得那样的开发多半是无奈之举,谁不愿意自己的代码多点提示,错误的时候也能够帮我们及时发现?
最后我选择的编辑器为vim、VS,至于vim和emacs之间做出了选择vim是因为个人觉得vim更轻量一些,不过你也需要使用插件。对于emacs,其实这个编辑器的功能似乎更强大,它集成的编译环境让我们的调试更加快速,不过这也看个人的喜好了。有人说为什么不用新生代的neovim?因为不少人觉得vim太慢、过时、很久没更新(吃老本),所以才有neovim的出现,可是我想说的是vim走到今天很不容易,而且现在代码的更新也很快了,作者似乎也意识到了大家所指出的那些毛病都是正确的,因此才有了更加快速的vim script等等加快编辑器速度的优化。由于习惯了使用vim,我觉得也没有必要再去尝试别的东西了,编辑器只是编写代码的辅助工具,所以在这个方面个人认为没必要做的本末倒置,只要自己认为用起来得心应手就好。
由于要使用最新的vim,因此我的安装方式也是源码安装,其实也可以去vim网站上下载rpm包进行安装,不过rpm包安装要注意依赖的关系。源码安装vim的脚本在这里:https://github.com/viticm/cpp_misc/blob/main/script/install_vim.sh
工作环境
职业发展
1、刚工作和工作不久
我本不打算在这里说自己这方面的心得,毕竟自己从来似乎就没有做过职业规划方面的事情,所以该条款仅仅是一点点微不足道的建议(以自身的经历和经验)。想起十多年前(2011)刚毕业在北方那座不大的城市顶着火热的太阳找工作的情形,颇感毕业生想要进入社会生存是多么不易(特别是自己本专业,据我所知90%以上都是从事了和自己专业无关的工作),其实不容易的也还有许许多多的打工人。那时候我还记得在学校的毕业设计,我是用的一个网上弄下来的图书管理系统,其代码是asp写的,刚好是我学校所学,为了完成任务在上面做了一些修改,然后进行一番分析后做出论文。虽然最后通过了答辩拿到了毕业证,可是找工作的时候却四处碰壁,一方面是因为学校所处的城市相关的工作较少,另一方面出来后用asp这个语言的公司几乎没有,其实我想大部分原因是公司不愿意培养一个完全没有经验的人。经过一个多月简历石沉大海,去公司唯唯诺诺的面试毫无结果之后,我开始想要提升一下自己。既然外面生存环境需要自己掌握技能,那么我就只能去提升了,那时候我发现做网站用的比较多的是PHP,因此我在网上搜了一圈后找到了一个培训班(先听我讲完)。我还记得当时的那位授课老师姓候,似乎是一位硕士,当时给了三天免费试听的课程。我到了那里之后听了一天课,发现其实那些内容如果自己找资料同样可以掌握,而且进度会更加快,所以一天以后我没有再去,而是转向图书馆买了三百多的书,这些书有C/C++开发、PHP开发、C/C++算法速查。至于为什么想学PHP却又买了C/C++的书,忘记听那位朋友说的,是自己对该语言产生了一定兴趣的结果。
在购买图书之后,我在网上找了一些视频,开始大约一个月的系统学习,其实每天也没有想象学习的那么满,而且天气也开始又炎热转凉,我只是有计划的慢慢推动自己的学习。对于绝顶聪明的人来说,他们知识消化的速度快,可能要不了多久就可以掌握新的知识,但对于我这样普通的人来说正应了老话”贪多嚼不烂“,因此我总的进度并不快。就算是因为这样,一个月左右我基本上掌握了PHP,算是入了门,毕竟一些高级用法只有在实践中才能慢慢掌握。总算在当年的11月左右我进入了职业生涯的第一家公司,这家公司是一个十人左右的小公司,其业务是外包一些网站产品的开发。所实话当时全没有想过职业发展的事情,认为首先让自己多年所学能够让自己生存下来就满足了,而且那时候工资也就两千左右,哪里像现在有的朋友起薪都过万,虽然说是都是十年前了,可是我想要说的是近两年大家的环境比之前要好很多了,虽然今年的环境似乎变差了一些,但我觉得那总是暂时的。第一份工作其实挺重要的,也许是上天不曾亏待我,第一份工作我遇到了好的工作环境,有一个挺不错的上级。我还记得那位上级其实年龄不小了,当时大概有四五十岁左右的年纪,想一想现在觉得35就过时未免觉得有点儿悲哀,至于年龄的坎大家纷纷认为这是中国产业升级失败的问题,至于真正的原因为何现在还没有定论。我的上级是原因分享和耐心的人,工作上不懂得只要你请教他都能耐心回答,而且也会组织我们一起对项目遇到的问题进行总结和分享,虽然我没有什么太好的建议,但也会对他们所说的问题发出疑问。有人说小公司就可以不注意规范问题,但是我第一个公司就不是,他们极力想要避免规范不一致带来的问题。或许规范这个从根本上来说确实是处于公司和项目上的考量,是为了让你的去留不会对项目造成过多的影响,不过总得来说多人协作开发的时候统一的规范会让组员能够更快地理解彼此所写的代码,在你没事的时候使用code review就能够看出一些问题,所以规范的统一还是有必要的。第二年我来到了南方的沿海城市,其实我还是挺感激第一家公司中我学习到的东西,虽然那时候来到新的城市也还是碰了不少壁。最后在次年大约五月份的时候,我进入了一家创业公司,从此开始了游戏开发之路。
游戏开发在当下并不陌生,不过近两年发展的也是良莠不齐,以及因为本行业的高工作强度为大家所诟病(据我所知软件大部分其实都差不多,否则github上也不会有996icu这个项目了)。一开始我是作为PHP做后台开发,这个后台就是用来对接游戏接口还有就是统计游戏中数据的功能,这一做大概就做了一年。顺嘴提一句,当时那家公司同一层有一个网易著名团队出来自创的公司,在同一层楼我感觉他们的福利确实挺好,而且能看到其作品质量也很不错。在做后台开发的时候,我也兼着做了一些运维的工作,当时忙的焦头烂额,小公司没有运维真的是很难,不过在这一年我确实学习了不少知识,不仅仅学会了许多曾经不熟悉的linux相应的操作和命令、还让我学会了使用vim编辑器,就是从这里开始vim就成为我的常用开发编辑器了(手动狗头,必须带插件)。能够掌握这些知识主要还是得感谢我那位同乡的上级,他不厌其烦甚至还借了一本书给我,并不因为我不了解就嗤之以鼻。在后来新的运维加入之后,我的负担大大降低后,就开始转向了后端开发,这一转就到了现在。后来我从这家创业公司去到一家当地在页游排行前几名的公司,这次其实我是和创业公司的一些小伙伴一起出去的,原因是老板不愿意继续那个项目了。
来到页游的公司,其实实际上我们项目还是手机游戏开发,我们项目也作为未来公司的一个开发方向得到了老板的重视。可是我们的组员并不齐全,特别是核心认为,前端和后端的老大需要从外引入,虽然这时候我们项目过去就有了前端和后端的人员。但是由于经验不足,我们不愿意也不敢去承担那份重任,所以希望从外面招揽人才来带领我们。也不知道什么原因,那种高级别的人才在当年6月份的时候像是特别缺乏,一个月了都未能找到合适的人员,是不是因为薪资问题我就不得而知了。但最后还是进来了一个客户端老大,不过他要求改用他熟悉的引擎(一个国外开源引擎),后来不到一个月似乎没有成效他就离开了。过后不久我们后端才来了一个老大,号称十多年资深的C++开发经验,进来之后也想要使用自己熟悉的代码(但我们项目本来已经正在用之前项目的代码在进行开发),所以他需要将我们以前的代码做一定的移植。然后问题就出现了,他进来不久后似乎是看我们是抱团进入的,不是他亲自招的人,所以甩手就让我们写几个功能,当时我以为是项目需要用到,所以连忙查找资料一边修改调试弄出来了,结果到了他那边不满意说存在问题,但是具体问题在哪里他又不愿意告知,甚至开始有点冷嘲热讽,说这么简单的问题都不会(后来我才发现原来他有可能就是存心要排挤,当时我们由于年轻没有感觉出来)。当时由于这个项目和我们几个人一起跟老板确定面谈下来,所以他只好离开了,后来我们后端的程序还被经理稍微数落了一下,他们其实也明白其中的原因(毕竟他们的年龄和经历比我们丰富)。这个上级对我们来说,我觉得他一点也懂不得分享(或许是我们确实缺乏经验,手动狗头),甚至还有点自高自大(其实看不出来真实水准,就算很厉害吧)。你想如果遇到这样的领导,你还能在项目中得到收获、获得快乐吗?
后来我回到了内地,依旧做后端开发,所遇到的领导都是原因分享的,不过这时候我从那家页游公司的那位上级处看到了其实知识有些时候也需要自己去掌握,所以近几年我都是自己查询资料进行学习。说了自己一大段的经历,其实我想说的是对于刚工作或者工作不久的朋友,在考虑薪资的同时,如果想要职业更好的发展,那么在选择你的上级和公司时,就需要关注他们是否有open精神,如果面对的是close的人那么你需要慎重考虑。在手里有选择的余地之下,尽量选择一个open的工作环境,那样可以快速提升自己的技术实力。
举个例子,可以提供大家参考,比如面试过我的一位面试官,他将会作为你的上级,在面试沟通中会问一些技术方面的问题。刚开始聊的都挺好,但是一听到我有开源过项目,并没有得到赞赏,反而变了一副嘲笑的态度,说是那不是很简单的吗?工作几年人人都会开源多少?最重点的一句是,他说其实真正好的东西其实不愿意分享的。当时我就在想,如果公司不用还好,因为站在公司立场它试错的风险是很大的,如果公司愿意使用你的功能和技术,为何不愿意分享出来,藏着掖着怎么能在实践中证明自己所实现的正确和可靠?从这里多多少少就能看出该上级close程度,特别是后来他抓着面试者不熟悉或遗忘的技术穷追猛打,我认为可能是公司大概是不缺人,或者就是想要通过所谓技术碾压来压低你商谈薪资的筹码,我认为这样都是不合适的。一个求职者来说,薪资如果不理想工作的时候总是会缺少一些干劲,就算是大环境不好情况下,也无需做出那么多让人感觉不舒服的举措,毕竟求职就是双向选择的过程。大部分技术面试的时候,你可以询问一下公司状况,和面试官的交谈中其实可以用技巧性的话术曲折打听出公司的open程度,在你考虑职业发展时尽量不要选择close的公司(如果薪资水平差别不大的情况下)。
2、不要觉得自己不够聪明
这句话是我从别人那里引来的,我认为这句话十分有道理,如果你觉得自己不够聪明那么你很多时候就会变得畏缩不前,对于未来的发展来说很有阻碍。就拿我自己来说,我曾经就是认为那些深入的软件设计就是高深莫测,所以刚开始的时候根本就不敢涉足。但就我的项目经历来说,我经历过由浅入深的过程,有些特别复杂的系统设计(比如游戏的战斗系统),这些我以前都没有接触过,就连自己维护都没有过,但是我参考了几个游戏的设计后,加上自己的理解,在几个类型不同的项目中仍旧能够游刃有余,那多半是多亏了自己的经验和不断学习的结果。
如果你觉得自己不够聪明,其实有时候往往只是一种经验缺乏的错觉,这时候你只需要补充你不足的经验即可。现在不比以前,现在是信息的时代,许多的技术知识在网上可以免费获取,你只需要花费一点点时间,接下来的就是看你对此的兴趣和坚持了。我相信大部分人都是差不多的,只是他们掌握知识的快慢不同而已,而且掌握的快不一定应用的好,而掌握的慢也不一定应用的不行。就像一个人在面试的时候很多技术问题可能回答的不好,但实际工作的时候表现得反而十分出色。
学历是否很重要?我就在这里说说自己的认知,当然的学历是一个人在以往学习优秀的证明,这一点上是毋庸置疑的,在某种程度上来说它是重要的。因此现在许多人大学毕业之后都选择继续深造,这一点上来说我也十分赞同。但是继续深造,还有为了更好的工作提升学历,就真的是必须的么?笔者并不认为学历是必须的,这不是我因为高考不理想的借口(差几分上本科,却不愿复读)。在这个世界上有许许多多的人,但是人活着并不是非得和学历挂钩,中国为何学历风盛行的原因追根究底其实是因为封建长久的科举制度造成的。特别是许多企业,标榜自己员工的本科率多少多少,其实这都是社会的问题,并不是我们的问题。但是说到这里,为了让自己有更好的生活,或者提升自己的知识水平,在自身条件充足的情况下,我还是比较支持去提升学历(虽然我个人比较懒,但是各位朋友只要有时间读个硕士还是可以的),特别有些知识要到了一定学历高度才会接触,一些高级的算法你没有进行相应的教育上手就比较困难。但如果自己没有条件,特别是家庭环境不好,需要自己考虑生计的事情,那么这时候学历对自己可能无法短时间去获得提升了,那么这时候可以利用零碎的时间多阅读书籍来提升自己的实力。在国外听说许多的企业不在乎学历和年龄,别人眼中就在乎你的skills,这就是他们那边的环境更加尊重人的能力,我相信有一天我们这里也会如此。
假如真的觉得自己不够聪明,就不断提升自己吧。
3、身体第一
本来打算写两个条目就足够,但是上面我说的都是工作上一些令人厌烦的事情,特别是学习,有些人总会觉得枯燥乏味。所以我在最后增加了这一条,一切的一切你都需要有个良好的身体,所以朋友们最需要关心自己的健康。工作是为了更好的生活,学习为了更好的工作,但一切的前提身体要健康、心里要快乐。
写在最后
杂七杂八
1、centos开发环境镜像
地址:待制作上传
2、开发环境脚本
地址:https://github.com/viticm/cpp_misc/blob/main/script
网络框架重构之路plain2.0(c++23 without module) 环境的更多相关文章
- Hybrid框架UI重构之路:六、前端那点事儿(Javascript)
上文回顾 :Hybird框架UI重构之路:五.前端那点事儿(HTML.CSS) 这里讲述在开发的过程中,一些JS的关键点. 换肤 对于终端的换肤,我之前一篇文章有说了我的想法. 请查看:http:// ...
- Hybrid框架UI重构之路:五、前端那点事儿(HTML、CSS)
上文回顾 :Hybird框架UI重构之路:四.分而治之 这里讲述在开发的过程中,一些HTML.CSS的关键点. 单页模式的页面结构 在单页模式中,弱化HTML的概念,把HTML当成一个容器,BODY中 ...
- Hybrid框架UI重构之路:三、工欲善其事,必先利其器
上文回顾:Hybird框架UI重构之路:二.事出有因 工欲善其事,必先利其器,事是重构的目标,器是开发环境. 这篇文章将讲述重构时的UI框架的目录结构,且需要使用的开发工具. 目录结构 demo : ...
- Magicodes.NET框架之路——V0.0.0.5 Beta版发布
最近写代码的时间实在不多,而且今年又打算业余学习下Unity3D以及NodeJs(用于开发游戏后台),因此完善框架的时间更不多了.不过我会一直坚持下去的,同时我也希望有兴趣的同学可以加入Push你的代 ...
- Hybrid框架UI重构之路:四、分而治之
上文回顾:Hybird框架UI重构之路:三.工欲善其事,必先利其器 上一篇文章有说到less.grunt这两个工具,是为了css.js分模块使用的.UI框架提供给使用者的时候,是一个大的xxx.js. ...
- Hybrid框架UI重构之路:二、事出有因
上文回顾:Hybird框架UI重构之路:一.师其长技以自强 一切的重构都是有原因的,或许为了更快速度.更好体验.更快捷开发等,于是就有了自己的开发目标,简单看看未重构前UI("中国移动式&q ...
- 【从0到1】android网络框架的选型参考
项目会使用到 socket tcp 级的网络访问,想选取一个使用较成熟异步网络框架, 提到的网络框架: 1. volley, 2. xutils. 3. android 4. netty, 5. mi ...
- Android Studio重构之路,我们重新来了解一下Google官方的Android开发工具
Android Studio重构之路,我们重新来了解一下Google官方的Android开发工具 记得我的第一篇博客就是写Android Studio,但是现在看来还是有些粗糙了,所有重构了一下思路, ...
- Seata RPC 模块的重构之路
简介: RPC 模块是我最初研究 Seata 源码开始的地方,因此我对 Seata 的 RPC 模块有过一些深刻研究,在我研究了一番后,发现 RPC 模块中的代码需要进行优化,使得代码更加优雅,交互逻 ...
- 事件驱动之Twsited异步网络框架
在这之前先了解下什么是事件驱动编程 传统的编程是如下线性模式的: 开始--->代码块A--->代码块B--->代码块C--->代码块D--->......--->结 ...
随机推荐
- Linux CentOS Docker 安装、加载配置
Docker Version:2.10.2 OS: CentOS 7 1.卸载 $ sudo yum remove docker \ docker-client \ docker-client-lat ...
- Linux子系统之【内存管理】
1.内存管理的意义? 内存是进程运行的地方,相当于是战场.完善的机制能让进程多快好省地运行. 2.原始内存管理是怎么样的? 简陋(直接运行在物理内存上).不安全(无隔离,无权限) 缺点:容易出错,进程 ...
- 5G智能网关助力打造5G移动医疗车
医疗资源分布不均衡,是导致老百姓看病难的重要原因之一.随着新一代信息技术的快速发展和普及应用,基于5G远程通信技术.音视频数字化技术,解决医疗资源分布不均衡问题,打破空间限制,让群众在家门口就能享受到 ...
- 引用本地的layUI
<script src="/public/vendor/layui-v2.5.6/layui.all.js"></script>
- nvm的下载安装
nvm下载地址:https://github.com/coreybutler/nvm-windows/releases 下载包,双击安装,选取路径, 注意:如果按默认的,安装在c盘的话,那之后的切换版 ...
- database.property文件
注意修改用户名密码 mysql8的版本要注意配置时区 此文件放置连接数据库的相关参数 jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://l ...
- idea连接服务器发包配置插件AlibabaCloudExplorer
添加配置信息: 启动项选择:Edit Configurations,添加插件选择插件Deploy to Host
- 内网jenkins跨版本升级
概要: 原来使用的jenkins版本为1.6,现在需要升级为最新版2.3.6 由于在内网,不能使用jenkins自带的在线升级工具 升级思路: 由于版本跨度太大,直接copy jenkins目录,启动 ...
- 解密Prompt系列3. 冻结LM微调Prompt: Prefix-Tuning & Prompt-Tuning & P-Tuning
这一章我们介绍在下游任务微调中固定LM参数,只微调Prompt的相关模型.这类模型的优势很直观就是微调的参数量小,能大幅降低LLM的微调参数量,是轻量级的微调替代品.和前两章微调LM和全部冻结的pro ...
- Java多线程开发CompletableFuture的应用
做Java编程,难免会遇到多线程的开发,但是JDK8这个CompletableFuture类很多开发者目前还没听说过,但是这个类实在是太好用了,了解它的一些用法后相信你会对它爱不释手(呸渣男,咋对谁 ...