精华内容
下载资源
问答
  • 微信公众账号开发框架总结
    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开发的代码相比较各有什么样特点。超轻量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,虚拟现实上面运行。

    shzyranpzcr37911.jpg

    谢邀~

    有①定影响,但肯定不大

    代码写的再好,如果想流行,想让别的程序员使用你的代码,必须有可读性,易用性,操作简便性等都非常好,也许⑥千行的代码从程序本身来说,可能写的非常多,但也要有冲击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更新一直失败》,感兴趣的同学可以点击进去看看。

    资源转载网络,如有侵权联系删除。

    展开全文
  • GuiLite(超轻量UI框架)是6千行代码的全平台UI框架,可以完美运行在iOS,Android,Windows(包含VR),Mac,单片机和市面所有的 ARM Linux物联网终端设备上。
  • 性能最好最轻最快最简单通用极速开发框架smart skin wpf outlook style score 升级版 version3 上千行数据绑定秒速渲染
  • 框架采用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调用接口

    声明接口

    075566990e05

    调用接口

    075566990e05

    其中compose函数中的参数DefaultTransformer是线程切换的实现,之前考虑对线程切换封装在上层,但影响了RxJava的链式调用,故使用compose实现之。

    2、图片加载Glide

    使用GlideUtil,一行代码显示。

    075566990e05

    3、下拉刷新XRecyclerView

    比起ListView, RecyclerView拥有更多的灵活性,更容易适应多变的需求,而XRecyclerView是基于RecyclerView扩展的库,直接继承于RecyclerView,代码侵入不高,支付宝android客户端也在使用。

    为减少重复代码,抽象出BaseListFragment,写列表页时可以直接继承它,并实现如下4个方法,即可完成一个列表页的编写,具体请参考DemoListFragment.java

    075566990e05

    3、错误预处理

    075566990e05

    在访问网络接口时,对服务端返回的错误信息有时并不符合需求,ApiException中,可以对返回的错误码进行预处理。

    4、新增tab业务模块

    新增tab业务模块时,只需add一个即可动态新增,不需改布局文件。

    075566990e05

    5、目录结构

    采用模块化结构区分,所有模块的activity不再放在一个文件夹中,新增模块需求时,新增目录编写,如下:

    075566990e05

    布局文件也按模块化分类

    075566990e05

    7、项目代码

    欢迎star和fork

    项目效果图:

    075566990e05

    最后,本项目使用到了很多优秀的库和控件,非常感谢 kymjs、stay、hongyang等等这些作者。

    展开全文
  • 2021SC@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项目中提供服务也不清楚,任重而道远吧。

    往期回顾

    ActiveJ框架学习——Codegen的初步认识

    ActiveJ框架学习---起步

    展开全文
  • 先来说一下常见的Android框架模式: MVC、MVP、MVVM 这三种框架中,我们耳熟能详的就是MVC和MVP了吧,接下来我们简单介绍一下: MVC View:XML布局文件。 Model:实体模型(数据的获取、存储、数据状态变化)。 ...
  • 移动端 web端上面2张图,按通常的开发量需要上千行代码,现在只需要开发10多行代码 我非常一致的 重复可能是软件中一切邪恶的根源。 StateGen? 轻代码还是敏捷开发? 否; 用可视化界面配置生成? 不 改变原开发...
  • Spring Boot简介及使用 目录 1.Spring Boot是什么 Spring Boot的由来 Spring Boot的特性 ...搭建Spring Boot开发框架 开发一个简单的Spring Boot应用程序 运行Spring Boot应用程序 3.SpringBoot生产级特...
  • 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://dzone.com/articles/cross-platform-mobile-development-2020-trends-and 多年来,跨平台移动...
  • - 轻量: 4千行C++代码,0依赖,单一头文件库(GuiLite.h) - 超快: 高效渲染,单片机上也能流畅运行 - 兼容: 完美兼容第3方GUI框架(Qt/MFC/Winform/Cocoa/Web),现有Qt/MFC代码可以继续使用 ## 跨平台 - 支持的操作...
  • 如所周知,自Windows 2000开始,开发驱动程序以WDM为基础的,但其开发难度之大,根本不能奢望像用户模式应用程序开发那样容易。为改善这种局面,微软推出了新的驱动程序开发环境。要预先指出的是,这不是另起炉灶...
  • 先来说一下常见的Android框架模式: MVC、MVP、MVVM Android 开发框架 Java框架 Java Android UI view Mode
  • Apache Log4j 是 Java 开发领域应用非常广泛的一款开源日志框架。根据谷歌安全团队的统计,截至 2021 年 12 月 16 日,来自 Maven Central 的 35,863 个可用 Java 组件依赖于 Log4j。这意味着 Maven Central 上超过...
  • 背景 我部正在开发的一个新项目,选择了jQuery作为基础的Javascript函数库。同时确定了jQuery提供的ajax系列方法作为异步推拉数据的基础接口。使用过ajax方法的同事应该是知道的,ajax方法需要提供一组选型,...
  • 前言 ByteX是字节团队推出的一个基于... 字节码插件开发平台 近期在学习研究字节码相关的技术,所以会整理一个系列文章着重分析ByteX各种插件的实现原理和思想。 阅读本文需要初步了解ASM技术,传...
  • 摘要: 在MVVM成熟之前MVP模式在Android上有被神化的趋势,笔者曾经...希望通过这篇blog能让读者了解如何使用MVP模式搭建一个功能完善的MVP模式开发框架,避免一些笔者认为比较严重的问题。 为什么要使用MVP模式
  • 动手能力,都是看书看资料,当别人还在纠结看什么书,还在纠结书里的字句是什么意思的时候,有些人的几百上千行代码都已经能运行了。 耐心和毅力,做程序员兴趣固然重要,写自己喜欢的代码那是相当愉快的事情,但是...
  • 自从做Team Leader之后,身上权责发生了变化,于是让我烦恼的不再是具体某个功能,某个界面的实现,而是如何在现有代码的基础上做渐进式的改进,创造出比较合适规范和框架,使得组内成员更快更好地完成任务。...
  • BabyOS:专为MCU项目开发提速的代码框架 。 LuatOS :LuatOS是运行在嵌入式硬件的实时操作系统,只需要少量内存的flash空间就能运行,用户编写lua代码就可完成各种功能。 Contiki-OS:一个小型的,开源的,极易移植...
  • GuiLite(超轻量UI框架)

    2021-05-19 06:17:44
    GuiLite超轻量UI框架,大道至简,5千行,仅头文件,全平台GUI库,可以运行在所有平台,例如:iOS/macOS/WathOS,Android,Linux(ARM/x86-64),Windows(包含VR),Docker和MCU)上,也可以与多种语言,例如:Swift,...
  • 作为一名在职岗位为【前端开发工程师】的程序员,我开发的应用程序经常需要获取用户位置信息,需要再某些场合下使用展示地图以及地图商的某些地点,需要获取行政区划列表(省市区)以及地址详情信息,需要在地图上...
  • 在我这几年的学习和成长中,慢慢的意识到搭建一个优秀的 Android 开发框架是一件非常困难以及痛苦的事情,它不仅需要满足不断增长的业务需求,还要保证框架自身的整洁与扩展...
  • 前端框架模式的变迁

    2017-11-22 09:25:27
    前端框架模式的变迁 前言 前端框架的变迁,体系架构的完善,使得我们只知道框架,却不明白它背后的道理。我们应该抱着一颗好奇心,在探索框架模式的变迁过程中,体会前人的一些理解和思考。 本篇将...
  • 这篇文章和大家说说Android届流行的三大框架,了解下架构的前世今生,以及我对于这些框架的一些认识和看法。 三大框架区别 MVC 架构介绍 Model:数据模型,比如我们从数据库或者网络获取数据 View:视图,也就是...
  • 20155303 《Java程序设计》实验一(Java开发环境的熟悉)实验报告一、实验内容及步骤(一)使用JDK编译、运行简单的java程序命令行下的程序开发步骤一(新建文件夹):打开windows下的cmd → 输入cd Code命令进入Code目录 ...
  • 这个程序的源码没有什么技术要求,一般至少能看懂95%,因为博主是大一上学期写着玩的,当时写了一周,还拿它参加了学校的创意编程比赛,结果第一用的ui,直接降维打击了,拿了个二等奖。。。 ...
  • 在这里主要列举了如下五个指标: bug类指标(间接指标):连续迭代的bug总数趋势、迭代内新建bug的趋势、千行bug率 单测的需求覆盖度(50%以上),参与人员覆盖度(80%以上) 单测case总数趋势,代码行增量趋势 增量...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,960
精华内容 1,184
热门标签
关键字:

千行开发框架