-
2016-12-20 14:14:23
由于公司产品战略需求,需要开发多个微信公众账号,可以选择使用IONIC作为UI框架,可以说它是一个很好的选择,符合Angular编写规范,但是IONIC的UI组件相对来说要少一些,没有侧栏、时间选择器、图片预览等组件,不能满足产品的一些需求,最后决定用采用SUI作为UI框架,开发框架使用Aangular,进行快速开发,但是在开发过程中遇到以下两个问题:
1.如果用户注册完成后或者登录成功后,跳转到相应的页面,在后退过程中还能后退到注册或者登陆页面,还有一些页面需要在back的时候根据业务逻辑进行控制,跳转到指定页面,并且切换效果也需要调整;
2.由于业务逻辑复杂,一个业务模块页面可能有上千行代码,大小超过150K,还不包括一些资源文件以及数据请求的时间损耗,造成在加载过程中比较缓慢,影响用户体验。
第一个问题解决方案是对SUI路由器的一些方法进行重写,在物理后退过程中进行拦截处理,实现根据业务需求进行一些特殊控制,代码如下:function smInit(){ //自定义控制参数 var CONFIG={ noAniPage:'blankpage',//$from.attr('id')='blankpage',即首次进入,不进行动画切换效果 isBack:false//判断是否为back状态,采用不同的切换效果 }; /*捕获返回按钮事件*/ var DIRECTION = { leftToRight: 'from-left-to-right', rightToLeft: 'from-right-to-left' }; var EVENTS = { pageLoadStart: 'pageLoadStart', // ajax 开始加载新页面前 pageLoadCancel: 'pageLoadCancel', // 取消前一个 ajax 加载动作后 pageLoadError: 'pageLoadError', // ajax 加载页面失败后 pageLoadComplete: 'pageLoadComplete', // ajax 加载页面完成后(不论成功与否) pageAnimationStart: 'pageAnimationStart', // 动画切换 page 前 pageAnimationEnd: 'pageAnimationEnd', // 动画切换 page 结束后 beforePageRemove: 'beforePageRemove', // 移除旧 document 前(适用于非内联 page 切换) pageRemoved: 'pageRemoved', // 移除旧 document 后(适用于非内联 page 切换) beforePageSwitch: 'beforePageSwitch', // page 切换前,在 pageAnimationStart 前,beforePageSwitch 之后会做一些额外的处理才触发 pageAnimationStart pageInit: 'pageInitInternal' // 目前是定义为一个 page 加载完毕后(实际和 pageAnimationEnd 等同) }; var routerConfig = { sectionGroupClass: 'page-group', // 表示是当前 page 的 class curPageClass: 'page-current', // 用来辅助切换时表示 page 是 visible 的, // 之所以不用 curPageClass,是因为 page-current 已被赋予了「当前 page」这一含义而不仅仅是 display: block // 并且,别的地方已经使用了,所以不方便做变更,故新增一个 visiblePageClass: 'page-visible', // 表示是 page 的 class,注意,仅是标志 class,而不是所有的 class pageClass: 'page' }; $.router._back = function (state, fromState) { //后退操作 CONFIG.isBack = true; //跳转到第一个页面时,再后退,关闭页面 if(state.pageId == "blankpage"||fromState.pageId == "firstpage"){ wx.closeWindow(); return; } //根据业务逻辑跳转到哪个页面 if(state.pageId == "secondpage"&&fromState.pageId=="thirdpage"){ _goPage("#firstpage",''); return; } if (this._isTheSameDocument(state.url.full, fromState.url.full)) { var $newPage = $('#' + state.pageId); if ($newPage.length) { var $currentPage = this._getCurrentSection(); this._animateSection($currentPage, $newPage, DIRECTION.leftToRight); this._saveAsCurrentState(state); } else { location.href = state.url.full; } } else { this._saveDocumentIntoCache($(document), fromState.url.full); this._switchToDocument(state.url.full, false, false, DIRECTION.leftToRight); this._saveAsCurrentState(state); } }; $.router._animateSection = function($from, $to, direction) { var toId = $to.attr('id'); $from.trigger(EVENTS.beforePageSwitch, [$from.attr('id'), $from]); $from.removeClass(routerConfig.curPageClass); $to.addClass(routerConfig.curPageClass); //页面初始化不执行动画切换效果 if($from.attr('id')!=CONFIG.noAniPage){ $to.trigger(EVENTS.pageAnimationStart, [toId, $to]); if(CONFIG.isBack){ direction=DIRECTION.leftToRight; }else{ direction=DIRECTION.rightToLeft; } this._animateElement($from, $to, direction); $to.animationEnd(function() { $to.trigger(EVENTS.pageAnimationEnd, [toId, $to]); // 外层(init.js)中会绑定 pageInitInternal 事件,然后对页面进行初始化 $to.trigger(EVENTS.pageInit, [toId, $to]); CONFIG.isBack=false; }); } }; }
对SUI的$.router._back和._animateSection方法进行重写,在进行物理返回操作时进行拦截,然后根据业务逻辑控制路由跳转和页面切换效果。
第二个问题处理起来比较简单,利用Requirejs进行模板加载,$compile对模板内容进行编译,并且动态绑定scope,实现模板根据路由动态加载,加载后的模板不进行重复加载,在DEMO中会有具体的操作处理,这里就不进行详细解释了,核心代码:
require(['text!'+tplurl],function(html){ $(container).append($(html)); $compile($(container))($scope); $scope.vm.tplcache.push(tplurl); callback(false); })
DEMO地址: https://github.com/mazhaohai/wechat-sui
以上只是个人对于微信端开发的一些总结,可能有一些设计上不是最优的,这个根据具体产品而定,包括Angular模板动态加载的问题,如果不想使用Angular,也可以用zepto+artTemplate等一些js模板技术搞定,但是路由控制,我觉得基本上已经满足产品的各种需求,如果哪位小伙伴有更好的方案或者架构,可以分享交流。
更多相关内容 -
这开源的6千行UI框架?同一种功能用mfc、qt、cocoa、unity、opengl、java swing、gaclib等UI开发的代码相...
2021-03-18 08:09:38本篇中小编将再为您讲解标题这开源的6千行UI框架?同一种功能用mfc、qt、cocoa、unity、opengl、java swing、gaclib等UI开发的代码相比较各有什么样特点。超轻量UI框架(GuiLite)可以在Android,Li...在上一篇文章中,小编为您详细介绍了关于《目前性能最好的集成显卡是什么样?G33主板的集成显卡 GMA 3100找不到适合Win2003的驱动20》相关知识。本篇中小编将再为您讲解标题这开源的6千行UI框架?同一种功能用mfc、qt、cocoa、unity、opengl、java swing、gaclib等UI开发的代码相比较各有什么样特点。
超轻量UI框架(GuiLite)可以在Android,Linux,Windows,虚拟现实上面运行。
谢邀~
有①定影响,但肯定不大
代码写的再好,如果想流行,想让别的程序员使用你的代码,必须有可读性,易用性,操作简便性等都非常好,也许⑥千行的代码从程序本身来说,可能写的非常多,但也要有冲击Qt或MFC的理由
代码在github上面。github.com/idea④good
运行视频在优酷,关键字:GuiLite
泻药
不会的。
每个行业都有其存在的价值。Qt的存在不是说他的UI框架,而是他的跨平台和啊、高效率开发。
有自己的优势,但。。。
这不就是QT写的吗
mfc是windows底层winapi③②的封装,opengl是绘图库,和dx,cocoa①个层次的,qt就是基于opengl的,gaclib是轮子哥把c#的ui移植到了c++,木有试过,不知道什么情况@vczh
用opengl,cocoa这种开发ui你就要从最底层的ui写起,包括事件驱动的模式也要自己实现,qt,java swing已经给你封装好了,mfc,gaclib没有试过,不是很清楚。
(谢谢轮子哥提醒,unity这里说的不是引擎,肤浅了……)
编后语:关于《这开源的6千行UI框架?同一种功能用mfc、qt、cocoa、unity、opengl、java swing、gaclib等UI开发的代码相比较各有什么样特点》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。
下一篇内容是有关《win10如何防范勒索病毒?win-10更新一直失败》,感兴趣的同学可以点击进去看看。
资源转载网络,如有侵权联系删除。
-
cpp-GuiLite超轻量UI框架是6千行代码的全平台UI框架
2019-08-15 19:35:44GuiLite(超轻量UI框架)是6千行代码的全平台UI框架,可以完美运行在iOS,Android,Windows(包含VR),Mac,单片机和市面所有的 ARM Linux物联网终端设备上。 -
性能最好最轻最快最简单通用极速开发框架smart skin wpf outlook style score 升级版 version3
2020-07-19 21:03:47性能最好最轻最快最简单通用极速开发框架smart skin wpf outlook style score 升级版 version3 上千行数据绑定秒速渲染 -
android快速开发框架(MVP+RxJava + Retrofit+Glide)
2021-06-04 10:49:36本框架采用MVP+RxJava + Retrofit+Glide,都是目前最流行的技术,适用中小团队快速进行项目开发, 目录结构清晰易懂,非常适合项目后期管理、迭代、重构等。且看具体介绍:一、使用技术及特点开发模式:MVP网络请求...本框架采用MVP+RxJava + Retrofit+Glide,都是目前最流行的技术,适用中小团队快速进行项目开发, 目录结构清晰易懂,非常适合项目后期管理、迭代、重构等。且看具体介绍:
一、使用技术及特点
开发模式:MVP
网络请求:RxJava+Retrofit
图片加载:Glide
下拉刷新:XRecyclerView
支持带COOKIE网络请求
支持HTTPS访问
支持JSON数据自动解析
支持protobuf数据自动解析
统一错误预处理
多种机型屏幕适配
二、使用说明及范例
1、TheMvp
传统的MVC模式(android应用开发因其结构的特殊性,并不是严格意义上的MVC模式),随着界面及其逻辑的复杂度不断提升,Activity类的职责不断增加,变得庞大臃肿,以致需求变更改起来尤其费劲,对于动辄几百行乃至上千行代码的activity类,代码可读性随着时间推移逐渐降低,而修改所带来的bug风险与日俱增,在这种情况下,MVP开发模式迅速在android技术圈火爆起来。
MVP模式结构清晰,代码好维护的道理大家都懂,然而事实上不是特大型项目,一般中小型项目很少使用MVP模式,开发一个页面所需要新增的接口,新增的类太多了!!严重影响开发效率。
TheMvp是轻量级MVP方案,使用activity作为presenter,View层分离出去,没有数不清的接口,很适合中小型项目。
2、网络请求RxJava + Retrofit
RxJava的链式访问利落清晰,在页面中进行网络请求所需要做的工作只需两步,
*在接口类中声明接口,如下图
*使用JsonApiWrapper或ProtoApiWrapper调用接口
声明接口
调用接口
其中compose函数中的参数DefaultTransformer是线程切换的实现,之前考虑对线程切换封装在上层,但影响了RxJava的链式调用,故使用compose实现之。
2、图片加载Glide
使用GlideUtil,一行代码显示。
3、下拉刷新XRecyclerView
比起ListView, RecyclerView拥有更多的灵活性,更容易适应多变的需求,而XRecyclerView是基于RecyclerView扩展的库,直接继承于RecyclerView,代码侵入不高,支付宝android客户端也在使用。
为减少重复代码,抽象出BaseListFragment,写列表页时可以直接继承它,并实现如下4个方法,即可完成一个列表页的编写,具体请参考DemoListFragment.java
3、错误预处理
在访问网络接口时,对服务端返回的错误信息有时并不符合需求,ApiException中,可以对返回的错误码进行预处理。
4、新增tab业务模块
新增tab业务模块时,只需add一个即可动态新增,不需改布局文件。
5、目录结构
采用模块化结构区分,所有模块的activity不再放在一个文件夹中,新增模块需求时,新增目录编写,如下:
布局文件也按模块化分类
7、项目代码
欢迎star和fork
项目效果图:
最后,本项目使用到了很多优秀的库和控件,非常感谢 kymjs、stay、hongyang等等这些作者。
-
ActiveJ框架学习(三)——ExpressionTest类千行源码分析
2021-10-16 10:36:332021SC@SDUSC 前文承接 上一篇文章以ExpressionToString类作为例子来分析了一下Expression DSL的使用方式,对于其他的Expression衍生类,... 往期回顾 ActiveJ框架学习——Codegen的初步认识 ActiveJ框架学习---起步2021SC@SDUSC
前文承接
上一篇文章以ExpressionToString类作为例子来分析了一下Expression DSL的使用方式,对于其他的Expression衍生类,关键的区别就在于不同的Expression DSL实现Expression接口的load()方法不同,在阅览其他的Expression类(即和ExpressionToString类同级的其他Expression开头的类)之后,觉得不能只看静态代码,所以这篇博客来分析一个ActiveJ源码中test包里的ExpressionTest类来学习一下Expression运行时提供的功能。
之所以本次分析ExpressionTest,test类的作用,在第一篇博客中讲到过,test通常是测试单个组件时做的工作(类似于软件工程课程中的单元测试),用来测试一个或一些局部的功能,例如一个方法能否正确返回结果或是调用正确过程等。test类中的代码在测试完毕后只要稍加修改就可以拿到正式的main包里去发布并且对外提供功能。
ExpressionTest
首先浏览ExpressionTest类的源码,映入眼帘的第一行代码:
@SuppressWarnings({"ArraysAsListWithZeroOrOneArgument"})
@SupressWarnings注解在整个ExpressionTest类中频繁出现,这里解释一下这个注解的意思:
/**
* Indicates that the named compiler warnings should be suppressed in the
* annotated element (and in all program elements contained in the annotated
* element).
*/即表示这个类对于 ArraysAsListWithZeroOrOneArgument 这个异常是忽略的,并且这里需要注意@SupressWarnings这个注解是有作用域的,即当一个类使用@SupressWarings,则这个类包含的方法也会自动忽略括号里的异常
之后,ExpressionTest定义了一个内部类 TestPojo,这里只需要注意有两个 int 属性就好,其方法的操作都是围绕两个int数据来进行的。这里所包含的方法就不再详细粘贴代码,其字面的意思基本是很容易理解的。
@SuppressWarnings("unused") public static class TestPojo { public int property1; public int property2; public TestPojo(int property1, int property2) { this.property1 = property1; this.property2 = property2; } public TestPojo(int property1) { } public void setproperty1(int property1) { } public int getproperty1() { } @Override public boolean equals(Object o) { } @Override public int hashCode() { int result = property1; result = 31 * result + property2; return result; } @Override public String toString() { return "TestPojo{property1=" + property1 + ", property2=" + property2 + '}'; } }
唯一需要注意的是这里的hashCode()是返回了一个int类型的数据,这个在之后的比较过程中会用到。
然后又定义了另一个内部类TestPojo2,虽然代码相比TestPojo多一点,但是整体结构和上一个内部类一模一样。
public static class TestPojo2 { public final String property1; public final int property2; public final long property3; public final float property4; public final int property5; public final double property6; public final String property7; /** *其后面的方法和TestPojo一样,不再列出 */ }
对两个内部类定义结束后,ExpressionTest又定义了一个与这第一个内部类相对应的接口Test,这个接口定义的方法是与TestPojo类相一致的,用来之后进行Test与TestPojo内部类的功能比较,从而提供一种使用反射来为外界服务的类生成方式。
接口定义完毕后,剩下的就是对二者进行比较:
@org.junit.Test public void test() throws ReflectiveOperationException { Class<Test> testClass = ClassBuilder.create(Test.class).defineClass(CLASS_LOADER); Test test = testClass.getDeclaredConstructor().newInstance(); // 之后即使用testClass生成的对象test来执行方法并与结果比较 }
接下来test()方法代码的剩余内容,就是将常数结果与test对象执行的方法得到的结果进行assertEquals()比较。
通过对整个类的结构浏览,可以注意到在每一个测试方法里,代码结构都是如下(体现出优秀代码的规范结构,学到了):
在第一个test()里,ActiveJ进行了一个与Test接口功能的对比:
assertEquals(11, (int) test.test(10)); assertEquals(33, test.hash(new TestPojo(1, 2))); assertEquals(1, test.property1(new TestPojo(1, 2))); assertEquals(new TestPojo(10, 20), test.setter(new TestPojo(1, 2))); assertEquals(new TestPojo(1, 2), test.ctor()); test.setXY(1, (byte) 10); assertEquals(1, (int) test.getX()); assertEquals(10, test.getY());
这里介绍一下assertEquals方法的使用,其实很简单,assertEquals方法对两个Long数据类型进行比较,例如在上诉的代码中,开发者分别对11与int(test.test(10))和33与test.hash()等多个数据进行了比较(这里的test.test(10)和test.hash()的返回值类型均为INT),ActiveJ将这两个数据与两个常数进行了assertEquals比较,如果相同的话则顺利得到如下执行结果:
这里是测试源码时控制台打印的结果
而如果两个Long数据不同则引发一个ERROR异常:
对这里的ExpressionTest方法运行,得到正确的程序结束语句,代表使用这种Expression DSL来构造的类结构与正常的类在功能上是一样的。
在之后的ExpressionTest代码中,ActiveJ又对Neg(数据类型溢出)、Operation(运算符,源码只测试了取余运算)、sh(位左移和右移)、位运算(Bitwise)、Call(方法调用)、Iterator(迭代)、BuildInstance(对象构造)以及SetSaveBytecode(文件存储)等其他常用到的java方法进行了测试和比较,结果均为正确结果。
至此,对于ExpressionTest的功能认识分析结束,作为一个测试类,此类涵盖了多种Expression功能,是一个比较大的开发测试类。
Test与Expression的联系
在浏览完ExpressionTest这个类的组成和功能后,我们再回过头来看java包中Expression类:
可以看到在java类中的Expression包中,出现了很多以我们刚才在ExpressionTest类中看见的方法名,而这些不同的Expression DSL,提供的功能,完全就是我们刚才浏览分析的ExpressionTest中同名方法的功能嘛,例如ExpressionCall这个类:
final class ExpressionCall implements Expression { private final Expression owner; private final String methodName; private final Expression[] arguments; ExpressionCall(Expression owner, String methodName, Expression[] arguments) { this.owner = owner; this.methodName = methodName; this.arguments = arguments; } @Override public Type load(Context ctx) { return ctx.invoke(owner, methodName, arguments); } }
这里的load()方法要求调用方发送正确的ctx参数内容才可以调用,合法的Context(例如这里显然是需要提供owner,methodName,arguments三个参数才可以)会被ExpressionCall类自动解析并调用methodName提供的方法。然后对比刚才分析的ExpressionTest类中对于Call()方法的使用:
@org.junit.Test public void testCall() { TestCall testCall = ClassBuilder.create(TestCall.class) .withMethod("callOther1", call(self(), "method", arg(0))) .withMethod("callOther2", call(self(), "method")) .withMethod("method", int.class, asList(int.class), arg(0)) .withMethod("method", long.class, asList(), value(-1L)) .withMethod("callStatic1", int.class, asList(int.class, int.class), staticCallSelf("method", arg(0), arg(1))) .withMethod("callStatic2", long.class, asList(long.class), staticCallSelf("method", arg(0))) .withStaticMethod("method", int.class, asList(int.class, int.class), arg(1)) .withStaticMethod("method", long.class, asList(long.class), arg(0)) .defineClassAndCreateInstance(CLASS_LOADER); }
这里的testCall()中使用了刚才定义的ExpressionCall类,因为我们使用ctrl点击 call(self(), "method", arg(0)) 方法,便可以定位到ExpressionCall类里:
public static Expression call(Expression owner, String methodName, Expression... arguments) { return new ExpressionCall(owner, methodName, arguments); }
项目代码中的一部分在测试类中执行成功,则代表这个ExpressionCall类的功能是没有问题的。这里也是学习软件开发规范的一步:先测试,测试成功后正式代码再发布对外提供调用的功能。
总结
通过对ExpressionTest类的分析,结合上周对于一个ExpressionToString类的分析,目前对Expression这个模块有了初步的认识,也进一步的描绘了其他单个Expression类的结构和功能。但是呢,截止到现在,也仅仅是分析了2周的结果,对于整个Expression和Codegen的大厦,至少对于我来说仍然是蒙在雾里,看不见轮廓。在Codegen的部分中,还有一个模块Report没有分析,Expression如何在整个ActiveJ项目中提供服务也不清楚,任重而道远吧。
往期回顾
-
Android开发应用框架汇总
2019-03-27 22:30:38先来说一下常见的Android框架模式: MVC、MVP、MVVM 这三种框架中,我们耳熟能详的就是MVC和MVP了吧,接下来我们简单介绍一下: MVC View:XML布局文件。 Model:实体模型(数据的获取、存储、数据状态变化)。 ... -
H5,iOS,andriod前端),是一些代码生成器+前端框架生成器+逐步迭代开发生成器+前端与内部交互(至响应式...
2021-03-23 02:16:13移动端 web端上面2张图,按通常的开发量需要上千行代码,现在只需要开发10多行代码 我非常一致的 重复可能是软件中一切邪恶的根源。 StateGen? 轻代码还是敏捷开发? 否; 用可视化界面配置生成? 不 改变原开发... -
微服务开发框架之Spring Boot
2018-11-30 14:32:07Spring Boot简介及使用 目录 1.Spring Boot是什么 Spring Boot的由来 Spring Boot的特性 ...搭建Spring Boot开发框架 开发一个简单的Spring Boot应用程序 运行Spring Boot应用程序 3.SpringBoot生产级特... -
2020年了,跨平台开发框架现在怎样了?
2020-04-08 10:26:46转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://dzone.com/articles/cross-platform-mobile-development-2020-trends-and 多年来,跨平台移动... -
GuiLite全平台GUI库源码,基于C和C++开发.rar
2021-05-24 22:39:20- 轻量: 4千行C++代码,0依赖,单一头文件库(GuiLite.h) - 超快: 高效渲染,单片机上也能流畅运行 - 兼容: 完美兼容第3方GUI框架(Qt/MFC/Winform/Cocoa/Web),现有Qt/MFC代码可以继续使用 ## 跨平台 - 支持的操作... -
Windows WDF驱动程序开发视频课程(**框架)
2021-02-11 06:42:19如所周知,自Windows 2000开始,开发驱动程序以WDM为基础的,但其开发难度之大,根本不能奢望像用户模式应用程序开发那样容易。为改善这种局面,微软推出了新的驱动程序开发环境。要预先指出的是,这不是另起炉灶... -
Android笔记:Android开发应用框架汇总(MVVP框架介绍)
2017-02-22 12:44:08先来说一下常见的Android框架模式: MVC、MVP、MVVM Android 开发框架 Java框架 Java Android UI view Mode -
Vue 框架涉及国家安全?前端框架也会有漏洞?尤雨溪郑重回应:前端框架并不存在渗透功能...
2022-01-28 00:03:39Apache Log4j 是 Java 开发领域应用非常广泛的一款开源日志框架。根据谷歌安全团队的统计,截至 2021 年 12 月 16 日,来自 Maven Central 的 35,863 个可用 Java 组件依赖于 Log4j。这意味着 Maven Central 上超过... -
一个基于jQuery ajax和.net httphandler 的超轻异步框架,千行代码完成。
2010-05-20 10:10:00背景 我部正在开发的一个新项目,选择了jQuery作为基础的Javascript函数库。同时确定了jQuery提供的ajax系列方法作为异步推拉数据的基础接口。使用过ajax方法的同事应该是知道的,ajax方法需要提供一组选型,... -
Android字节码框架ByteX [method_call_opt] 源码分析
2022-03-05 17:13:40前言 ByteX是字节团队推出的一个基于... 字节码插件开发平台 近期在学习研究字节码相关的技术,所以会整理一个系列文章着重分析ByteX各种插件的实现原理和思想。 阅读本文需要初步了解ASM技术,传... -
从零开始搭建 一个完善的 MVP模式开发框架(一),MVP模式的简单介绍篇
2017-06-28 20:13:55摘要: 在MVVM成熟之前MVP模式在Android上有被神化的趋势,笔者曾经...希望通过这篇blog能让读者了解如何使用MVP模式搭建一个功能完善的MVP模式开发框架,避免一些笔者认为比较严重的问题。 为什么要使用MVP模式 -
关于Android开发的面试经验总结,源码+原理+手写框架
2021-04-21 19:20:57动手能力,都是看书看资料,当别人还在纠结看什么书,还在纠结书里的字句是什么意思的时候,有些人的几百上千行代码都已经能运行了。 耐心和毅力,做程序员兴趣固然重要,写自己喜欢的代码那是相当愉快的事情,但是... -
iOS App开发那些事:如何选择合适的人、规范和框架?
2015-04-27 13:55:27自从做Team Leader之后,身上权责发生了变化,于是让我烦恼的不再是具体某个功能,某个界面的实现,而是如何在现有代码的基础上做渐进式的改进,创造出比较合适规范和框架,使得组内成员更快更好地完成任务。... -
成为嵌入式高手,少不了这100多个软硬件开源项目
2022-02-20 01:21:45BabyOS:专为MCU项目开发提速的代码框架 。 LuatOS :LuatOS是运行在嵌入式硬件的实时操作系统,只需要少量内存的flash空间就能运行,用户编写lua代码就可完成各种功能。 Contiki-OS:一个小型的,开源的,极易移植... -
GuiLite(超轻量UI框架)
2021-05-19 06:17:44GuiLite超轻量UI框架,大道至简,5千行,仅头文件,全平台GUI库,可以运行在所有平台,例如:iOS/macOS/WathOS,Android,Linux(ARM/x86-64),Windows(包含VR),Docker和MCU)上,也可以与多种语言,例如:Swift,... -
腾讯位置服务开发应用-使用教程,案例分享,知识总结
2020-12-24 15:28:00作为一名在职岗位为【前端开发工程师】的程序员,我开发的应用程序经常需要获取用户位置信息,需要再某些场合下使用展示地图以及地图商的某些地点,需要获取行政区划列表(省市区)以及地址详情信息,需要在地图上... -
我的Android重构之旅:框架篇
2019-05-09 08:00:00在我这几年的学习和成长中,慢慢的意识到搭建一个优秀的 Android 开发框架是一件非常困难以及痛苦的事情,它不仅需要满足不断增长的业务需求,还要保证框架自身的整洁与扩展... -
前端框架模式的变迁
2017-11-22 09:25:27前端框架模式的变迁 前言 前端框架的变迁,体系架构的完善,使得我们只知道框架,却不明白它背后的道理。我们应该抱着一颗好奇心,在探索框架模式的变迁过程中,体会前人的一些理解和思考。 本篇将... -
谈谈Android项目框架的前世今生
2020-10-29 10:40:46这篇文章和大家说说Android届流行的三大框架,了解下架构的前世今生,以及我对于这些框架的一些认识和看法。 三大框架区别 MVC 架构介绍 Model:数据模型,比如我们从数据库或者网络获取数据 View:视图,也就是... -
20155303 《Java程序设计》实验一(Java开发环境的熟悉)实验报告
2021-03-11 13:07:3420155303 《Java程序设计》实验一(Java开发环境的熟悉)实验报告一、实验内容及步骤(一)使用JDK编译、运行简单的java程序命令行下的程序开发步骤一(新建文件夹):打开windows下的cmd → 输入cd Code命令进入Code目录 ... -
无任何格外需求的命令行C++飞机大战,内含BOSS,动画,千行代码免费奉上
2021-12-30 09:00:56这个程序的源码没有什么技术要求,一般至少能看懂95%,因为博主是大一上学期写着玩的,当时写了一周,还拿它参加了学校的创意编程比赛,结果第一用的ui,直接降维打击了,拿了个二等奖。。。 ... -
Spock框架初体验:更优雅地写好你的单元测试
2022-03-06 18:12:53在这里主要列举了如下五个指标: bug类指标(间接指标):连续迭代的bug总数趋势、迭代内新建bug的趋势、千行bug率 单测的需求覆盖度(50%以上),参与人员覆盖度(80%以上) 单测case总数趋势,代码行增量趋势 增量...