精华内容
下载资源
问答
  • 设计开发控制程序

    千次阅读 2019-03-11 20:17:00
    程序规定了对研发项目设计控制,确保新产品满足设计输入的要求,达到正确地提供满足顾客所有要求的产品的目的。 2适用范围 本程序适用于本公司研发项目的控制。 3定义 3.1项目经理:...

    欢迎关注博主公众号:【纯洁的明依】文章由陈晓阳原创。
    本人微信:chenxiaoyangzxy. 免费提供本人大量学习资料。

    1 目的

        本程序规定了对研发项目设计控制,确保新产品满足设计输入的要求,达到正确地提供满足顾客所有要求的产品的目的。

      2 适用范围

        本程序适用于本公司研发项目的控制。

      3 定义

      3.1 项目经理:具体负责组织实施完成研发项目的负责人。

      3.2 助理工程师:项目组组成员当中,协助项目经理完成设计任务的主要助手。

      4 职责

    4.1 各事业部产品处负责研发项目立项、阶段评审、进度跟进以及项目绩效考评的组织管理工作。

    4.2 研发中心各研发处负责研发工作的具体实施。

    4.3 各相关部门参与研发项目的辅助工作。

      5 程序

      5.1 运作流程如下图:

         

     

     

     

    输入

                      工作流程图

    输出

    《需求申请表》

    《问题定义报告》

    《可行性分析报告》

     

     

    各相关部门

     

    研发处

     

     

    研发工程师

     

    产品处

     

    项目工程师、DQA测试工程师

     

     

    产品处

     

    项目工程师、DQA测试工程师

     

    产品处

     

     

    项目工程师

     

     

    制造中心

     

    制造工程部

     

     

     

     

     

    《研发项目立项申请表》

     

     

     

    《研发项目任务书》

     

     

    《研发项目计划进度表》

     

    《研发项目评审记录》

     

    《研发样机DQA测试作业

    办法》

     

     

    《研发项目评审记录》

     

    《研发样机DQA测试作业

    办法》

     

    《研发项目评审记录》

     

     

    《小批量试产委托通知书》

     

     

     

     

    《新产品开发问题分析与解答》

     

    5.2 设计和开发的策划

          搜集信息、建立目标项目,新产品项目来源有如下几种:

      5.2.1 客户委托;

      5.2.2 参考《XX财年产品开发规划方案》;

      5.2.3 研发中心、业务部等部门,依据现时需要,临时提出立项方案。

      5.3 立项

      5.3.1 项目的确立必须以《研发项目立项申请表》的方式提出,报总裁办批准后方可实施。原则上,谁引入项目,谁就提出申请。年度规划项目由各事业部产品处代为申请。

      5.3.2 申请人必须详细填写产品规格要求、客户要求以及立项的理由,必要时应另附文件予以支持。提交《研发项目立项申请表》的同时需编写《研发项目财务预算单》,作为立项参考。

      5.3.3各评审部门应结合本部门可行性和必要性,对申请人提出项目仔细评估,对项目的可行性进行评估时需考虑环保要求,必要时应组织本部门会议进行讨论,最终本部门主管签署意见。

      5.3.4 对一些显而易见的项目,立项可以采取各评审部门签署意见的方式进行。任何一个部门若对立项项目有异议,均可通过研发中心总经办,要求召开评审会议,以决定立项是否可行。

      5.4 组织和技术接口

          各事业部产品处负责督促该事业部新产品开发计划实施,作为各事业部与研发中心之间的接口,将有关的信息归总到研发中心总经办,由总经办形成书面文件,予以传递并定期评审。

      5.5 设计和开发输入

      5.5.1 《研发项目立项申请表》中“项目介绍”以及“客户主要要求事项”均应作为设计和开发输入的组成部分。立项申请人要协助项目工程师,结合有关的国家标准、行业标准、企业标准、合同评审(用户的要求)和其它要求,形成产品要求说明及产品规格说明书。技术规格书必须提交研发中心总监审核、总经理批准并发行、存档。设计输入的主要内容有:

      5.5.1.1 新产品功能和性能要求;

      5.5.1.2 有关的国家标准、行业标准;

      5.5.1.3 有关法规法令和社会要求; 

      5.5.1.4 用户对产品的需求(或合同评审的结果);

      5.5.1.5 来自过去类似设计有用的信息。

      5.5.2 在设计输入评审过程中评审委员会(各阶段评审委员会成员由总经办和产品处根据实际需要确定,下同)填写《研发项目评审记录》,对设计输入主要内容是否恰当、是否充分进行评审,以确保设计输入符合规定要求。

      5.5.3 评审过程中发现不完善的,含糊的或是有矛盾的要求应提出.由新产品开发项目负责人会同相关部门处理解决。

      5.6 下达设计任务书

    5.6.1 由各研发处将“设计和开发”输入进行必要的转化,形成任务书中“项目功能和技术要求”。

    5.6.2 《研发项目任务书》由各研发处下达,产品处主管进行审核,研发中心总经理或总监批准。

      5.7 设计和开发

    5.7.1 项目经理接到《研发项目任务书》后,应对项目进行分解,制定《研发项目计划进度表》,规定各阶段计划完成时间以及各阶段负责人。对于客户委托开发项目,其最终完成时间不应超过客户规定的时间,否则应及时向客户报告,征求客户同意。其他项目,其计划时间与实际完成时间仅作为个人业绩考评参考,不作为研发过程程序进行强制要求。进度更改应填写《研发项目进度更改申请表》。

      5.8 设计和开发评审

      5.8.1项目经理在完成《研发项目任务书》各阶段性工作后,应及时向产品处反馈,由产品处向研发中心总经办提出申请,总经办组织实施评审工作,并由产品处填写《研发项目评审记录》。评审合格后方可进行下阶段工作。项目设计开发输出评审时,需考虑环保要求(正样评审要求品质部参加)。

      5.8.2 首样评审、正样评审以DQA测试报告为主要依据。首样评审为非必要过程,研发项目工程师或评审小组根据技术方案的成熟性和调试自检结果,认为首样技术性能和工艺成熟性能够达到正样要求时,决定直接申请正样测试和正样评审;反之,首样也可能是多次。项目经理在评审之前应留出足够时间给DQA试验。

      5.9 设计和开发输出

      5.9.1 原理和方案评审阶段的输出

      5.9.1.1 原理图;

      5.9.1.2 新器件BOM,主要是价格较高、采购周期较长的电子元器件;

      5.9.1.3 BOM清单(由原理图生成)以及相应的总成本。

      5.9.2 首样评审阶段的输出

      5.9.2.1 至少四台样机;

      5.9.2.2 DQA测试报告;

      5.9.2.3 工艺评估报告。

      5.9.3 正样评审阶段的输出

      5.9.3.1 至少七台样机;

      5.9.3.2 DQA测试报告;

      5.9.3.3 工艺评估报告;

      5.9.3.4 传导、辐射、谐波、风量、噪声、温度打点测试记录。

      5.9.3.5 Chroma测试报告。

    5.9.4 资料发行阶段的输出

    5.9.4.1 设计文档部分(交项目管理处保存)

    5.9.4.1.1 DQA测试报告;

    5.9.4.1.2 工艺评估报告;

    5.9.4.1.3 传导、辐射、谐波、风量、噪声、温度打点测试记录。

    5.9.4.2 生产文档部分(交DCC保存并发行)

    5.9.4.2.1 BOM清单;

    5.9.4.2.2 原理图;

    5.9.4.2.3 Layout各层图(一式两份);

    5.9.4.2.4 性能规格书;

    5.9.4.2.5 Chroma测试报告;

    5.9.4.2.6 结构图,包括:标贴、包装、外壳、散热片、输出线材等;

    5.9.4.2.7 变压器、各式电感器件图。

    5.10 设计验证

         设计验证由本公司小批量试产或客户端小批量试产得出。

    5.11 设计确认

         设计确认由产品处综合验证各个环节信息,最终进行裁定。或由客户反馈确认信息,如客户没有书面反馈,可依是否下达订单为据。

    5.12 设计更改

    5.12.1 设计验证后发现设计差错、难于制造和安装、产品性能需改进等需要进行变改,项目经理需提出设计更改申请,经批准后实施。

    5.12.2 量产中若涉及到设计更改,则按《工程变更申请(ECR)及工程变更(ECN)运作作业办法》执行。

      6   参考文件

      6.1 《工程变更申请(ECR)及工程变更(ECN)运作作业办法》         Q01-731-02

      6.2 《品质记录控制程序》              Q01-422

      7   附录

      7.1 《研发项目立项申请表》            Q01-731-00-01

      7.2 《研发项目成本预算清单》          Q01-731-00-02

      7.3 《预研项目成本预算清单》          Q01-731-00-03

      7.4 《研发项目任务书》                Q01-731-00-04

      7.5 《研发项目计划进度表》            Q01-731-00-05

      7.6 《研发项目评审记录》              Q01-731-00-06

      7.7 《研发项目进度更改申请表》        Q01-731-00-07

      7.8 《研发项目设计更改申请单》        Q01-731-00-08

      7.9 《研发项目奖励申请书》            Q01-731-00-09

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 本文内容,主题是透过应用程序来分析Android系统的设计原理与构架。我们先会简单介绍一下Android里的应用程序编程,然后以这些应用程序在运行环境上的需求来分析出,为什么我们的Android系统需要今天这样的设计方案...

    本文内容,主题是透过应用程序来分析Android系统的设计原理与构架。我们先会简单介绍一下Android里的应用程序编程,然后以这些应用程序在运行环境上的需求来分析出,为什么我们的Android系统需要今天这样的设计方案,这样的设计会有怎样的意义, Android究竟是基于怎样的考虑才变成今天的这个样子,所以本文更多的分析Android应用程序设计背后的思想,品味良好架构设计的魅力。分五次连载完成,第一部分是最简单的部分,解析Android应用程序的开发流程。

    特别声明:本系列文章LiAnLab.org著作权所有,转载请注明出处。作者系LiAnLab.org资深Android技术顾问吴赫老师。本系列文章交流与讨论:@宋宝华Barry

    1.  Android应用程序

    在目前Android大红大紫的情况下,很多人对编写Android应用程序已经有了足够深入的了解。即便是没有充分的认识,在现在Android手机已经相当普及的情况下,大家至少也会知道Android的应用程序会是一个以.apk为后缀名的文件(在Windows系统里,还会是一个带可爱机器人图标的文件)。那这个apk包又有什么样的含义呢?

    如果您正在使用Linux操作系统,可以使用命令file命令来查看这一文件的类型。比如我们下载了一个Sample.apk的文件,则使用下面的命令:

    $file Sample.apk
    Sample.apk: Zip archive data, at least v1.0 to extract
    

    对,没有看错,只一个简单的zip文件。要是做过Java开发的人,可以对这种格式很亲切,因为传说中的.jar、.war格式,都是Zip压缩格式的文件。我们可继续使用unzip命令将这一文件解压(或是任何的解压工具,zip是人类历史是最会古老最为普及的压缩格式之一,几乎所有压缩工具都支持)。通过解压,我们就得到了下面的文件内容:

    AndroidManifest.xml,
    classes.dex,
    resources.arsc,
    META-INF,
    res,
    

    到这里,我们就可以看到一个Android应用程序结构其实是异常简单的。这五部分内容(其中META-INF和res是目录,其他是文件)除了META-INF是这一.apk文件的校验信息,resources.arsc是资源的索引文件,其他三部分则构成了Android应用程序的全部。

    Þ     AndroidManifest.xml,这是每个Android应用程序包的配置文件,这里会保存应用程序名字、作者、所实现的功能、以及一些权限验证信息。但很可惜,在编译完成的.apk文件里,这些文件都被编译成了二进制版本,我们暂时没有办法看到内容,后面我们可以再看看具体的内容。

    Þ     classes.dex,这则是Android应用程序实现的逻辑部分,也就是通过Java编程写出来而被编译过的代码。这种特殊的格式,是Android里特定可执行格式,是可由Dalvik虚拟机所执行的代码,这部分内容我们也会在后续的介绍Dalvik虚拟机的章节里介绍。

    Þ     res,这一目录里则保存了Android所有图形界面设计相关的内容,比如界面应该长成什么样子、支持哪些语言显示等等。

    从一个android应用程序的包文件内容,我们可以看到android应用程序的特点,这也是Android编程上的一些特征:

    1      简单:最终生成的结果是如些简单的三种组成,则他们的编程上也不会有太大的困难性。这并不是说Android系统里无法实现很复杂的应用程序,事实上Android系统拥有世界上仅次于iOS的应用程序生态环境,也拥有复杂的办公软件、大型3D游戏。而只是说,如果要实现和构成同样的逻辑,它必然会拥有其他格式混杂的系统更简化的编程模式。

    2      Java操作系统:既然我们编译得到的结果,classes.dex文件,是用于Java虚拟机(虽然是Dalvik虚拟机,但实际上这一虚拟机只是一种特定的Java解析器和虚拟机执行环境 )解析执行的,于是我们也可以猜想到,我们的Android系统,必然是一个Java操作系统。我们在后面会解释,如果把Android系统直接看成Linux内核和Java语言组合到一起的操作系统很不准确,但事实上Android,也还是Java操作系统,Java是唯一的系统入口。

    使用MVC设计模式:所谓的MVC,就是Model,View,Controller的首字母组合起来的一种设计模式,主要思想就是把显示与逻辑实现分离。Model用于保存上下文状态、View用于显示、而Controller则是用于处理用户交互。三者之间有着如下图所示的交互模型,交互只到Controller,而显示更新只通过View进行,这两者再与Model交换界面状态信息:


    在现代的图形交互相关的设计里,MVC几乎是在图形交互处理上的不二选择,这样系统设计包括一些J2EE的应用服务器框架,最受欢迎的Firefox浏览器,iOS,MacOSX等等。这些使用MVC模式的最显著特点就是显示与逻辑分离,在Android应用程序里我们看到了用于逻辑实现的classes.dex,也看到用于显示的res,于是我们也可以猜想到在UI上便肯定会使用MVC设计模式。

                当然,所谓的Android应用程序编程,不会只有这些内容。到目前为止,我们也只是分析.apk文件,于是我们可以回过头来看看Android应用被编译出来的过程。

    2.  Android编程

    从编程角度来说,Android应用程序编程几乎只与Java相关,而Java平台本身是出了名跨平台利器,理论上来说,所有Java环境里使用的编程工具、IDE工具,皆可用于Android的编程。Android SDK环境里提供的编程工具,是基于标准的Java编译工具ant的,但事实上,一些大型的Android软件工程,更倾向于使用Maven这样的并行化编译工具(maven.apache.org)。如果以前有过Java编程经验,会知道Java环境里的图形化IDE(Integrated Development Environment)工具,并非只有Eclipse一种,实际上Java的官方IDE是NetBeans,而商用化的Java大型项目开发者,也可能会比较钟意于使用IntelliJ,而从底层开发角度来说,可能使用vim是更合适的选择,可以灵活地在C/C++与Java代码之间进行切换。总而言之,几乎所有的Java环境的编程工具都可以用于Android编程。

    对于这些工具呢,熟悉工具的使用是件好事,所谓“磨刀不误砍柴工”,为将来提升效率,这是件好事。但是要磨刀过多,柴没砍着,转型成“磨刀工”了。如果过多地在这些编程工具上纠结尝试,反而忽视了所编代码的本身,这倒会舍本逐末。

    我们既然是研究Android编程,这时仅说明两种Android官方提供的编程方法:使用Android SDK工具包编程,或是使用Eclipse + ADT插件编程。

    2.1 使用Android SDK工具包

    在Android开发过程中,如果Eclipse环境不可得的情况下,可以直接使用SDK来创建应用程序工程。首先需要安装某一个版本的Android SDK开发包,这个工具包可以到http://developer.android.com/sdk/index.html这个网址去下载,根据开发所用的主机是Windows、Linux还是MacOS X(MacOS仅支持Intel芯片,不支持之前的PowerPC芯片),下载对应的.zip文件,比如android-sdk_r19-linux.zip。下载完成后,解压到一个固定的目录,我们这里假定是通过环境变量$ANDROID_SDK_PATH指定的目录。

    下载的SDK包,默认是没有Android开发环境支持的,需要通过tools目录里的一个android工具来下载相应的SDK版本以用于开发。我们通过运行$ANDROID_SDK_PATH/tools/android会得到如下的界面:


    在上面的安装界面里选择不同的开发工具包,其中Tools里包含一些开发用的工具,如我们的SDK包,实际上也会在这一界面里进行更新。而对于不同的Android版本,1.5到4.1,我们必须选择下载某个SDK版本来进行开发。而下载完之后的版本信息,我们既可以在这一图形界面里看到,也可以通过命令行来查看。

    $ANDROID_SDK_PATH/tools/android list targets
    id: 1 or "android-16"
         Name: Android 4.1
         Type: Platform
         API level: 16
         Revision: 1
         Skins: HVGA, QVGA, WQVGA400, WQVGA432, WSVGA, WVGA800 (default), WVGA854, WXGA720, WXGA800, WXGA800-7in
         ABIs : armeabi-v7a
    ----------
    id: 2 or "Google Inc.:Google APIs:16"
         Name: Google APIs
         Type: Add-On
         Vendor: Google Inc.
         Revision: 1
         Description: Android + Google APIs
         Based on Android 4.1 (API level 16)
         Libraries:
          * com.google.android.media.effects (effects.jar)
              Collection of video effects
          * com.android.future.usb.accessory (usb.jar)
              API for USB Accessories
          * com.google.android.maps (maps.jar)
              API for Google Maps
         Skins: WVGA854, WQVGA400, WSVGA, WXGA800-7in, WXGA720, HVGA, WQVGA432, WVGA800 (default), QVGA, WXGA800
         ABIs : armeabi-v7a
    

    通过android list targets列出来的信息,可以用于后续的开发之用,比如对于不同的target,最后得到了id:1、id:2这样的信息,则可以被用于应用程序工程的创建。而细心一点的读者会看到同一个4.1版本的SDK,实际可分为”android-16”和"Google Inc.:Google APIs:16",这样的分界也还有有意义的,”android-16”用于“纯”的android 4.1版的应用程序开发,而“Google Inc.:Google APIs:16”则加入了Google的开发包。

                配置好环境之后,如果我们需要创建Android应用程序。tools/android这个工具,同时也具备可以创建Android应用程序工程的能力。我们输入:

    $ANDROID_SDK_PATH/tools/android create project -n Hello -t 1 -k org.lianlab.hello -a Helloworld -p hello

    这样我们就在hello目录里创建了一个Android的应用程序,名字是Hello,使用API16(Android 4.1的API版本),包名是org.lianlab.hello,而默认会被执行到的Activity,会是叫Helloworld的Activity类。

    掌握Android工具的一些使用方法也是有意义的,比如当我们的Eclipse工程被破坏的情况下,我们依然可以手工修复这一Android应用程序工程。或是需要修改该工程的API版本的话,可以使用下面的命令:

    $ANDROID_SDK_PATH/tools/android updateproject -t 2 -p .

                在这个工程里,如果我们不加任何修改,会生成一个应用程序,这个应用程序运行的效果是生成一个黑色的图形界面,打印出一行"Hello World, Helloworld"。如果我们需要对这一工程进行编译等操作的话,剩下的事情就属于标准的Java编译了,标准的Java编译,使用的是ant(ant.apache.org)编译工具。我们先改变当前目录到hello,然后就可以通过” ant –projecthelp”来查看可以被执行的Android编译工程,

    $ ant -projecthelp
    Buildfile: /Users/wuhe/android/workspace/NotePad/bin/tmp/hello/build.xml
    
    Main targets:
    
     clean       Removes output files created by other targets.
     debug       Builds the application and signs it with a debug key.
     install     Installs the newly build package. Must be used in conjunction with a build target                             (debug/release/instrument). If the application was previously installed, the application                             is reinstalled if the signature matches.
     installd    Installs (only) the debug package.
     installi    Installs (only) the instrumented package.
     installr    Installs (only) the release package.
     installt    Installs (only) the test and tested packages.
     instrument  Builds an instrumented packaged.
     release     Builds the application in release mode.
     test        Runs tests from the package defined in test.package property
     uninstall   Uninstalls the application from a running emulator or device.
    Default target: help
    

    但如果只是编译,我们可以使用antdebug生成Debug的.apk文件,这时生成的文件,会被放到bin/Hello-debug.apk。此时生成的Hello-debug.apk,已经直接可以安装到Android设备上进行测试运行。我们也可以使用ant release来生成一个bin/Hello-release-unsigned.apk,而这时的.apk文件,则需要通过jarsigner对文件进行验证才能进行安装。

    通过antdebug这一编译脚本,我们可以看到详细的编译过程。我们可以看到,一个Android的工程,最后会是通过如图所示的方式生成最后的.apk文件。


    把一个Android的源代码工程编译成.apk的Android应用程序,其过程如下:

    1)      所有的资源文件,都会被aapt进行处理。所有的XML文件,都会被aapt解析成二进制格式,准确地说,这样的二进制格式,是可以被直接映射到内存里的二进制树。做过XML相关开发的工程师,都会知道,XML的验证与解析是非常消耗时间与内存的,而通过编译时进行XML解析,则节省了运行时的开销。当然解析的结果最后会被aapt通过一个R.java保存一个二进制树的索引,编程时可通过这个R.java文件进行XML的访问。aapt会处理所有的资源文件,也就是Java代码之外的任何静态性文件,这样处理既保证了资源文件间的互相索引得到了验证,也确保了R.java可以索引到这个应用程序里所有的资源。

    2)      所有的Java文件,都会被JDK里的javac工具编译成bin目录下按源代码包结构组织的.class文件(.class是标准的Java可解析执行的格式),比如我们这个例子里生成的bin/classes/org/lianlab/hello/*.class文件。然后这些文件,会通过SDK里提供的一个dx工具转换成classes.dex文件。这一文件,就是会被Dalvik虚拟机所解析执行的

    3)      最后我们得到的编译过的二进制资源文件和classes.dex可执行文件,会通过一个apkbuilder工具,通过zip压缩算法打包到一个文件里,生成了我们所常见的.apk文件。

    4)      最后,.apk文件,会通过jarsigner工具进行校验,这一校验值会需要一个数字签名。如果我们申请了Android开发者帐号,这一数字签名就是Android所分发的那个数字证书;如果没有,我们则使用debug模式,使用本地生成的一个随机的数字证书,这一文件位于~/.android/debug.keystore。

                虽然我们只是下载了SDK,通过一行脚本创建了Android应用程序工程,通过另一行完成了编译。但也许还是会被认为过于麻烦,因为需要进行字符界面的操作,而且这种开发方式也不是常用的方式,在Java环境下,我们有Eclipse可用。我们可以使用Eclipse的图形化开发工具,配合ADT插件使用。

    2.2 使用Eclipse+ADT插件

    在Android环境里可以使用Java世界里几乎一切的开发工具,比如NetBeans等,但Eclipse是Android官方标准的开发方式。使用Eclipse开发,前面提到的开发所需SDK版本下载,也是必须的,然后还需要在Eclipse环境里加装ADT插件,Android Development Toolkit。

    我们在Eclipse的菜单里,选择”Help” à “Install New Software…”,然后在弹出的对话框里的Workwith:输入ADT的发布地址:https://dl-ssl.google.com/android.eclipse,回车,则会得到下面的软件列表。选择Select All,将这些插件全都装上,则得到了可用于Android应用程序开发的环境。


    这里还需要指定SDK的地址,Windows或是Linux里,会是在菜单“Window” à “Preferences”,在MacOS里,则会是”Eclipse” à“Preferences” 。在弹出的对话框里,选择Android,然后填入Android SDK所保存的位置。


    点击OK之后,则可以进行Android开发了。选择”File” à “New”à “Project” à “Android”,在Eclipse 3.x版本里,会是“Android Project”,在Eclipse 4.x版本里,会是“Android Application Project”。如果我们需要创建跟前面字符界面下一模一样的应用程序工程,则在弹出的创建应用程序对话框里填入如下的内容:


    然后我们选择Next,一直到弹出最后界面提示,让我们选择默认Activity的名字,最后点击”Finish”,我们就得到一个Android应用程序工程,同时在Eclipse环境里,我们既可以通过图形化界面编辑Java代码,也可以通过图形化的界面编辑工具来绘制图形界面。

    (注意: 如果Android工程本身比较庞大,则最好将Eclipse里的内存相关的配置改大。在Windows和Linux里,是修改eclipse里的eclipse.ini文件,而在MacOS里,则是修改Eclipse.app/Contents/MacOS/eclipse.ini。一般会将如下的值加大成两倍:

    --launcher.XXMaxPermSize
    512m
    -vmargs
    -Xms80m
    -Xmx1024m
    )
    

    我们得到工程目录,在Eclipse环境里会是如下图所示的组织方式。代码虽然是使用一模一样的编译方式,唯一的改变是,我们不再需要使用脚本来完成编译,我们可以直接使用Eclipse的”Project”à“Build project”来完成编译过程。如果我们使用默认设置,则代码是使用自动编译的,我们的每次修改都会触发增量式的编译。


    我们从这些android编程的过程,看不出来android跟别的Java编程模式有什么区别,倒至少验证了我们前面对android编程特点的猜想,就是很简单。如果同样我们使用Eclipse开发Java的图形界面程序,需要大量地时间去熟悉API,而在Android这里学习的曲线被大大降低,如果我们只是要画几个界面,建立起简单的交互,我们几乎无须学习编程。

    而从上面的步骤,我们大概也可以得到Android开发的另一个好处,就是极大的跨平台性,它的开发流程里除了JDK没有提及任何的第三方环境需求,于是这样的开发环境,肯定可以在各种不同的平台执行。这也是Android上进行开发的好处之一,跨平台,支持Windows,Linux与MacOS三种。

    我们再来看一个,我们刚才创建的这个工程里,我们怎么样进行下一步的开发。在Android开发里,决定我们应用程序表现的,也就是我们从一个.apk文件里看到的,我们实际上只需要:

    Þ     修改AndroidManifest.xml文件。AndroidManifest.xml是Android应用程序的主控文件,类型于Windows里的注册表,我们通过它来配置我们的应用程序与系统相关的一些属性。

    Þ     修改UI显示。在Android世界里,我们可以把UI编程与Java编程分开对待,处理UI控件的语言,我们可以叫它UI语言,或是layout语言,因为它们总是以layout类型的资源文件作为主入口的。Android编程里严格地贯彻MVC的设计思路,使我们得到了一个好处,就是我们的UI跟要实现的逻辑没有任何必然联系,我们可先去调整好UI显示,而UI显示后台的实现逻辑,则可以在后续的步骤里完成。

    Þ     改写处理逻辑的Java代码。也就是我们MVC里的Controller与Model部分,这些部分的内容,如果与UI没有直接交互,则我们可以放心大胆的改写,存在交互的部分,比如处理按钮的点击,取回输入框里的文字等。作为一个定位于拓展能力要求最高的智能手机操作系统,android肯定不会只实现画画界面而已,会有强大的可开发能力,在android系统里,我们可以开发企业级应用,大型游戏,以及完整的Office应用。

    无论是通过tools/android工具生成的Android源代码目录,还是通过Eclipse来生成的Android源代码工程,都需要进一步去自定义这个步骤来完成一个Android应用程序。当然,还有一种特殊的情况就是,这个源代码工程并非直接是一个Android应用程序,只是Unit Test工程或是库文件工作,并不直接使用.apk文件,这里则可能后续的编程工作会变得不同。我们这里是分析Android应用程序,于是后面分别来看应用程序编程里的这三部分的工作如何进行。

    2.3 AndroidManifest.xml

    先来看看AndroidManifest.xml文件,一般出于方便,这一文件有可能也被称为manifest文件。像我们前面的例子里的创建的Android工程,得到的AndroidManifest.xml文件就很简单:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="org.lianlab.hello"
          android:versionCode="1"
          android:versionName="1.0">
        <application android:label="@string/app_name">
            <activity android:name=".Helloworld"
                      android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    </manifest>
    

    作为xml文件,所有的<>都会是成对的,比如我们看到的<manifest></manifest>,这被称为标签(Tag)。标签可以包含子标签,从而可以形成树型的结点关系。如果没有子标签,则我们也可以使用</>来进行标识,比如我们上面看到的<actionandroid:name=”android.intent.action.MAIN” />。

    <manifest>,是主标签,每个文件只会有一个,这是定义该应用程序属性的主入口,包含应用程序的一切信息,比如我们的例子里定义了xml的命名空间,这个应用程序的包名,以及版本信息。

    <application>,则是用于定义应用程序属性的标签,理论上可以有多个,但多个不具有意义,一般我们一个应用程序只会有一个,在这个标签里我们可以定义图标,应用程序显示出来的名字等。在这一标签里定义的属性一般也只是辅助性的。

    <activity>,这是用来定义界面交互的信息。我们在稍后一点的内容介绍Android编程细节时会描述到这些信息,这一标签里的属性定义会决定应用程序可显示效果。比如在启动界面里的显示出来的名字,使用什么样的图标等。

    <intent-filter>,这一标签则用来控制应用程序的能力的,比如该图形界面可以完成什么样的功能。我们这里的处理比较简单,我们只是能够让这个应用程序的HelloWorld可以被支持点击到执行。

    从这个最简单的AndroidManifest.xml文件里,我们可以看到Android执行的另一个特点,就是可配置性强。它跟别的编程模型很不一样的地方是,它没有编程式规定的main()函数或是方法,而应用程序的表现出来的形态,完全取决于<activity>字段是如何定义它的。

    2.4 图形界面(res/layout/main.xml)

    我们可以再来看android的UI构成。UI也是基于XML的,是通过一种layout的资源引入到系统里的。在我们前面看到的最简单的例子里,我们会得到的图形界面是res/layout/main.xml,在这一文件里,我们会看到打开显示,并在显示区域里打印出Hello World, Helloworld。

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:padding="@dimen/padding_medium"
            android:text="@string/hello_world"
            tools:context=".HelloWorld" />
    </RelativeLayout>
    

    在这个图形界面的示例里,我们可以看到,这样的图形编程方式,比如传统的方式里要学习大量的API要方便得多。

    <LinearLayout>,这一标签会决定应用程序如何在界面里摆放相应的控件

    <TextView>,则是用于显示字符串的图形控件

    使用这种XML构成的UI界面,是MVC设计的附属产品,但更大的好处是,有了标准化的XML结构,就可以创建可以用来画界面的IDE工具。一流的系统提供工具,让设计师来设计界面、工程师来逻辑,这样生产出来的软件产品显示效果与用户体验会更佳,比如iOS;二流的系统,界面与逻辑都由工程师来完成,在这种系统上开发出来的软件,不光界面不好看,用户体验也会不好。我们比如在Eclipse里的工程里查看,我们会发现,我们打开res/layout/main.xml,会自动弹出来下面的窗口,让我们有机会使图形工具来操作界面。


    在上面IDE工具里,左边是控件列表,中间是进行绘制的工作区,右边会是控件一些微调窗口。一般我们可以从左边控制列表里选择合适的控件,拖到中间的工作区来组织界面,原则上的顺序是layout à 复合控件 à 简单控件。中间区域可以上面还有选择项用于控制显示属性,在工作区域里我们可以进一步对界面进行微调,也可以选择控件点击左键,于是会出来上下文菜单来操作控件的属性。到于右边的操作界面,上部分则是整个界面构成的树形结构,而下部分则是当我们选择了某个界面元素时,会显示上下文的属性。最后,我们还可以在底部的Graphic Layout与main.xml进行图形操作界面与源代码编辑两种操作方式的切换。

    有了这种工具,就有可能实现设计师与工程师合作来构建出美观与交互性更好的Android应用程序。但可惜的是,Android的这套UI设计工具,太过于编程化,而且由于版本变动频繁的原因,非常复杂化,一般设计师可能也不太容易学好。更重要的一点,Android存在碎片化,屏幕尺寸与显示精度差异性非常大,使实现像素级精度的界面有技术上的困难。也这是Android上应用程序不如iOS上漂亮的原因之一。但这种设计至少也增强了界面上的可设计性,使Android应用程序在观感上也有不俗表现。

    我们可以再回过头来看看应用程序工程里的res目录,res目录里包含了Android应用程序里的可使用的资源,而资源文件本身是可以索引的,比如layout会引用drawable与values里的资源。对于我们例子里使用的<TextView  … android:text="Hello World,Helloworld" …>,我们可以使用资源来进行引用,<TextView …android:text=” @string/hello_string” …>,然后在res/values/strings.xml里加入hello_string的定义。

    <string name="hello_world">Hello world!</string>

    从通过这种方式,我们可以看另外一些特点,就是Android应用程序在多界面、多环境下的自适应性。对于上面的字符串修改的例子,我们如果像下面的示例环境那样定义了res/layout-zh/strings.xml,并提供hello_string的定义:

     <string name="hello_world">欢迎使用!</string>

    最后,得到的应用程序,在英文环境里会显示‘Hello world!’,而如果系统当前的语言环境是中文的话,就会显示成‘欢迎使用!’。这种自适应方式,则是不需要我们进行编程的,系统会自动完成对这些显示属性的适配。

    当然,这时可能会有人提疑问,如果这时是韩文或是日文环境会出现什么情况呢?在Android里,如果不能完成相应的适配,就会使用默认值,比如即使是我们创建了res/values-zh/strings.xml资源,在资源没有定义我们需要使用的字符串,这时会使用英文显示。不管如何,Android提供自适应显示效果,但也保证总是不是会出错。

    这些也体现出,一旦Android应用程序写出来,如果对多语言环境不满意,这时,我们完全可以把.apk按zip格式解开,然后加入新的资源文件定义,再把文件重新打包,也就达到了我们可能会需要的汉化的效果。


    在res目录里,我们看到,对于同一种类型的资源,比如drawable、values,都可以在后面加一个后缀,像mdpi,hdpi, ldpi是用于适配分辨率的,zh是用来适配语言环境的,large则是用来适配屏幕大小的。对于这种显示上的自适应需求,我们可以直接在Eclipse里通过创建Android XML文件里得到相应的提示,也可以参考http://developer.android.com/training/basics/supporting-devices/查看具体的使用方式

    于是,透过资源文件,我们进一步验证了我们对于Android MVC的猜想,在Android应用程序设计里,也跟iOS类似,可以实现界面与逻辑完全分离。而另一点,就是Android应用程序天然具备屏幕自适应的能力,这一方面带来的影响是Android应用程序天生具备很强的适应性,另一方面的影响是Android里实现像素精度显示的应用程序是比较困难的,维护的代价很高。

    我们可以再通过应用程序的代码部分来看看应用程序是如何将显示与逻辑进行绑定的。

    2.5  Java编程(src/org/lianlab/hello/HelloWorld.java)

    在Android编程里,实现应用程序的执行逻辑,几乎就是纯粹的Java编程。但在编程上,由于Android的特殊性,这种Java编程也还是被定制过的。

                我们看到我们例子里的源代码,如果写过Java代码,看到这样的源代码存放方式,就可以了解到Android为什么被称为Java操作系统的原因了,像这种方式,就是标准的Java编程了。事实上,在Android的代码被转义成Dalvik代码之前,Android编程都可被看成标准的Java编程。我们来看这个HelloWorld.java的源代码。

    package org.lianlab.hello;
    import android.os.Bundle;
    import android.app.Activity;
    
    public class HelloWorld extends Activity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
        }
    }
    

    代码结构很简单,我们所谓的HelloWorld,就是继承了Activity的基类,然后再覆盖了Acitivity基于的onCreate()方法。

                Activity类,是Android系统设计思路里的很重要的一部分,所有与界面交互相关的操作类都是Activity,是MVC框架里的Controller部分。那Model部分由谁来提供呢?这是由Android系统层,也就是Framework来提供的功能。当界面失去焦点时,当界面完全变得不可见时,这些都属于Framework层才会知道的状态,Framework会记录下这些状态变更的信息,然后再回调到Activity类提供的相应状态的回调方法。关于Activity我们后面来详细说明,而见到Activity类的最简单构成,我们大体上就可以形成Android世界里的完整MVC框架构成完整印象了。

                我们继承了Activity类之后,就会覆盖其onCreate()回调方法。这里我们使用了”@Override”标识,这是一种Java语言里的Annotation(代码注释)技术,相当于C语言里的pragma,用于告诉编译器一些相应参数。我们的Override则告诉javac编译器,下面的方法在构建对象时会覆盖掉父类方法,从而提高构建效率。Activity类里提供的onXXX()系列的都可以使用这种方法进行覆盖,从而来实现自定义的方法,切入到Android应用程序不同状态下的自定义实现。

                我们覆盖掉的onCreate()方法,使用了一个参数,savedInstanceState,这个参数的类型是Bundle。Bundle是构建在Android的Binder IPC之上的一种特殊数据结构,用于实现普通Java代码里的Serialization/Deserializaiton功能,序列化与反序列化功能。在Java代码里,我们如果需要保存一些应用程序的上下文,如果是字符串或是数据值等原始类型,则可以直接写到文件里,下次执行时再把它读出来就可以了。但假设我们需要保存的是一个对象,比如是界面的某个状态点,像下面的这样的数据结构:

    class ViewState {
        public int focusViewID;
        public Long layoutParams ;
        public String textEdited;
    …
    }
    
    这时,我们就无法存取这样的结构了,因为这样的对象只是内存里的一些标识,存进时是一个进程上下文环境,取回来时会是另一种,就会出错。为了实现这样的功能,就需要序列化与反序列化,我们读写时都不再是以对象为单位,而是以类似于如下结构的一种字典类型的结构,最后进行操作的是一个个的键值对, ViewState[‘focusViewID’]的值会是valueOfViewID,一个整形值。

    ‘ViewState’ {
    
                ‘focusViewID’: valueOfViewID,
    
                ‘LayoutParams’:valueOfLayoutParams,
    
                ‘textEdited’:  ‘User input’,
    
    }

    我们按这种类似的格式写到文件里,当再读取出来时,我们就可以新建一个ViewState对象,再使用这些保存过的值对这一对象进行初始化。这样就可以实现对象的保存与恢复,这是我们onCreate()方法里使用Bundle做序列化操作的主要目的,我们的Activity会有不同生存周期,当我们有可能需要在进程退出后再次恢复现象时,我们就会在退出前将上下文环境保存到一个onSavedInstance的Bundle对象里,而在onCreate()将显示的上下文恢复成退出时的状态。

                而另一个必须要使用Bundle的理由是,我们的Activity与实现Activity管理的Framework功能部件ActivityManager,是构建在不同进程空间上的,Activity将运行在自己独立的进程空间里,而Framework则是运行在另一个系统级进程SystemServer之上。我们的Bundle是一种进行过序列化操作的对象,于是相应的操作是系统进程会触发Activity的进行onCreate()回调操作,而同时会转回一个上下文环境的Bundle,可将Activity恢复到系统指定的某种图形界面状态。Bundle也可能为空,比如Activity是第一个被启动的情况下,这个空的onSavedInstance则会被忽略掉。

                我们进入到onCreate()方法之后,第一行便是

    super.onCreate(savedInstanceState);

    从字面上看,这种方式相当于我们继承了父类方法,然后又回调到父类的onCreate()来进行处理。这种方式貌似很怪,但这是设计模式(Design Pattern)里鼎鼎大名的一种,叫IoC ( Inversion of Control)。通过这样的设计模式,我们可以同时提供可维护性与可调试性,我们可以在通过覆盖的方法提供功能更丰富的子类,实际上每次调用子类的onCreate()方法,都将调用到各个Activity拓展类的onCreate()方法。而这个方法一旦进入,又会回调到父类的onCreate()方法,在父类的onCreate()方法里,我们可以提供更多针对诸多子类的通用功能(比如启动时显示的上下文状态的恢复,关闭时一些清理性工作),以及在这里面插入调试代码。

                然后,我们可以加载显示部分的代码的UI,

    setContentView(R.layout.main);

    这一行,就会使我们想要显示的图形界面被输出到屏幕上。我们可以随意地修改我们的main.xml文件,从而使setContentView()之后显示出来的内容随之发生变化。当然,作为XML的UI,最终是在内存里构成的树形结构,我们也可以在调用setContentView()之前通过编程来修改这个树形结构,于是也可以改变显示效果。

                到目前为止,我们也只是实现了将内容显示到屏幕上,而没有实现交互的功能。如果要实现交互的功能,我们也只需要很简单的代码就可以做到,我们可以将HelloWorld.java改成如下的内容,从而使用我们的”Hello world”字符串可以响应点击事件:
    package org.lianlab.hello;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.TextView;
    
    public class HelloWorld extends Activity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
          ((TextView)findViewById(R.id.textView1)).setOnClickListener(
                    new OnClickListener() {
                       @Override
                       public void onClick(View v) {
                               finish();
                       }
               });
        }
    }
    

    我们使用Activity类的findViewById()方法,则可以找到任何被R.java所索引起来的资源定义。我们在这里使用了R.id.textView1作为参数,是因为我们在main.xml就是这么定义TextView标签的:android:id="@+id/textView1"

    而我们找到字段之后,会调用TextView对象的setOnClickListener()方法,给TextView注册一个onClickListener对象。这样的对象,是我们在Android世界里遇到的第二次设计模式的使用(事实上Android的实现几乎使用到所有的Java世界里的通用设计模式),Listener本身也会被作为Observer设计模式的一种别称,主要是用于实现被动调用逻辑,比如事件回馈。

    Observer(Listener)设计模式的思路,跟我们数据库里使用到的Trigger功能类似,我们可对需要跟踪的数据操作设置一个Trigger,当这类数据操作进行时,就会触发数据库自动地执行某些操作代码。而Observer(Listener)模式也是类似的,监听端通过注册Observer来处理事件的回调,而真正的事件触发者则是Observer,它的工作就是循环监听事件,然后再调用相应监听端的回调。

    这样的设计,跟效率没有必然联系,太可以更大程度地降低设计上的复杂度,同时提高设计的灵活性。一般Observer作为接口类,被监听则会定位成具体的Subject,真正的事件处理,则是通过实现某个Observer接口来实现的。对于固定的事件,Subject对象与Observer接口是无须变动的,而Observer的具体实现则可以很灵活地被改变与扩充。如下图所示:


    如果我们对于监听事件部分的处理,也希望能加入这样的灵活性,于是我们可以继续抽象,将Subject泛化成一个Observable接口,然后可以再提供不同的Observable接口的实现来设计相应的事件触发端。


    针对于我们的Android里的OnClickListener对象,则是什么情况呢?其实不光是OnClickListener,在Android里所有的事件回调,都有类似于Observer的设计技巧,这样的回调有OnLongClickListener,OnTouchListener,OnKeyListener,OnContextMenuListener,以及OnSetOnFocusChangeListener等。但Android在使用设计模式时很简洁,并不过大地提供灵活性,这样可以保证性能,也可以减小出错的概率(基本上所有的设计复杂到难以理解的系统,可维护性远比简单易懂但设计粗糙的系统更差,因为大部分情况下人的智商也是有限的资源)。于是,从OnClickLister的角度,我们可以得到下图所示的对象结构。


    Click事件的触发源是Touch事件,而当前View的Touch事件在属于点击事件的情况下,会生成一个performClick的Runnable对象(可交由Thread对象来运行其run()回调方法)。在这个Runnable对象的run()方法里会调用注册过的OnClickListener对象的OnClick()方法,也就是图示中的mOnClickListener::onClick()。当这个对象被post()操作发送到主线程时(作为Message发送给UI线程的Hander进行处理),我们覆盖过的OnClick()回调方法就由主线程执行到了。

    我们注册的Click处理,只有简单的一行,finish(),也就是通过点击事件,我们会将当前的Activity关闭掉。如果我们觉得这样不过瘾,我们也可通过这次点击触发另一个界面的执行,比如直接搜索这个字符串。这样的改动代码量很小,首先,我们需要在HelloWorld.java的头部引入所需要的Java包,

    import android.app.SearchManager;
    import android.content.Intent;
    

    然后可以将我们的OnClick()方法改写成启动一个搜索的网页界面,查找这个字符串,而当前界面的Activity则退出。这时,我们新的OnClick()方法则会变成这个样子:

     public void onClick(View v) {
            Intent query = new Intent(Intent.ACTION_WEB_SEARCH);
            query.putExtra(SearchManager.QUERY,
     ((TextView)v).getText());
            startActivity(query);
            finish();
       }           
    

    但是可能还是无法解决我们对于Android应用程序与Java环境的区别的疑问:

    Þ     Android有所谓的MVC,将代码与显示处理分享,但这并非是标准Java虚拟机环境做不到。一些J2EE的软件框架也有类似的特征。

    Þ     AndroidManifest.xml与On*系列回调,这样的机制在JAVA ME也有,JAVA ME也是使用类似的机制来运行的,难道Android是JAVA ME的加强版?

    Þ     至于Listener模式的使用,众所周知,Java是几乎所有高级设计模式的实验田,早就在使用Listener这样模式在处理输入处理。唯一不同的是ClickListener,难道Android也像是可爱的触摸版Ubuntu手机一样,只在是桌面Java界面的基础加入了触摸支持?

    Þ     Activity从目前的使用上看,不就是窗口(Window)吗?Android开发者本就有喜欢取些古怪名字的嗜好,是不是他们只是标新立异地取了个Activity的名字?

    对于类似这样的疑问,则是从代码层面看不清楚了,我们得回归到Android的设计思想这一层面来分析,Android应用程序的执行环境是如何与众不同的。

    不过,我们可以从最后的那行Activity调用另一个Activity的例子里看出一些端倪,在这次调用里,我们并没有显式地创建新的Activity,如果从代码直接去猜含义的话,我们只是发出了个执行某种操作的请求,而这个请求并没有指定有谁来完成。这就是Android编程思想的基础,一种全开放的“无界化”编程模型。

    展开全文
  • 元数据驱动的应用程序设计开发

    千次阅读 2011-05-15 23:16:00
    元数据 应用程序 设计 开发

    全面介绍使用元数据驱动处理应用程序设计。如果软件构架的使用能够用模式来定义,元数据就是用来描述那些模式的语言。

    本页内容

    牢记30岁? 牢记30岁?
    你的模式有多牛 你的模式有多牛
    无处不在的模式 无处不在的模式
    谁想减负阿? 谁想减负阿?
    通过描述模式来获得功能上的好处,政策和服务抽象 通过描述模式来获得功能上的好处,政策和服务抽象
    技术 技术
    链接SOA和使用元数据的网络服务 链接SOA和使用元数据的网络服务
    建议 建议
    元数据驱动SOA 元数据驱动SOA
    从SOA到CORBA,从SOA到Web Services,从SOA到 从SOA到CORBA,从SOA到Web Services,从SOA到
    设计直接实现 ——将元数据连接到工具 设计直接实现 ——将元数据连接到工具
    编译时 编译时
    运行时 运行时
    文档 文档
    适应性 适应性
    有帮助么? 有帮助么?
    参考资料 参考资料

    在这篇文章中,我提供了一个使用元数据驱动的方法来设计应用的概述,这是一个注重实效的方法,而且在应用程序的开发中实际可行。本文使用一种开放的模式写成,所以并不是针对很深入技术的人群的。我希望本文能演示出为什么元数据驱动的设计是投身软件产品创造的IT专家最有力的工具之一。

    牢记30岁?

    回忆起30岁,那是一段简单经历。没有积极的参加过大型的“美好20岁”聚会,没有在深夜的时候去过夜总会,也没有喝酒喝到第二天早上还不舒服。但是失去了炫耀和庆典的经历也是很值得纪念的。取代宿醉的是一个很小的现实——明确地叙述模式对科技工作者来说是很重要的。

    我在新加坡协助一个小组为一个银行运作外包选择和项目集成。我在我生日的前不久到达,先放下自己的想法,阅读一些资料,可能也能做一点事,并且在我回家之前肯定要推迟所有的庆祝活动。我的一个同事Lyn明显被我的态度吓住了,并且她有完全不同的看法。在那个隆重的一天举行的宴会上,我找准时机摸到了我们旅馆十七层的酒吧里。我们就在那坐着,欣赏着新加坡港美丽的景色,我喝着新加坡流行的斯林酒,Lyn喝着水果鸡尾酒 ,当时她已经有将近六个月的身孕了。我已经不止一次的幻想过我30岁的生日了。

    这是我们第一次工作的如此之近,因此我们坐着讨论了职业的好运气,因为是它把我们带到这个项目上来的。Lyn从前为SWIFT工作过,并且拥有大量项目所需要的商业知识。对于我而言,我的上一份工作是从事一个大型自定义应用软件项目。但是这一次,我的角色是定义一个构架,并且把各种各样项目将要使用的产品定位并整合起来。

    很明显,Lyn和我由于有着不同的职业背景而扮演者不同的角色,一个是商业角色,另一个是技术角色。快到最后的时候了,很奇怪的是我们不想以争论的方式结束,开始协调商业和技术的因素了,但是Lyn和我那天晚上就一件事达成了共识,这件事影响了我的专业工作,就从阅读模式文献开始。当同种情况发生在IT项目上时,它在模式上也发生作用,并且这些模式不仅仅只是为了技术。

    你的模式有多牛

    事实上,模式的分析,设计和执行在当今的IT产业中已经到处存在,且已收到宣传作用。在模式领域内,如果把可用资金放开,毋庸置疑,多数IT产业中的关键人物相信,把模式应用到应用程序的创建当中将是一条颇有价值和力量的方法。许多模式的方面已经满足了方法论学者,分析师,设计者,实现者,测试者和经营者的共同目标。换句话说就是,模式拥有高质量,高可维持性,高可靠性和快速发现解决方案的特性。

    在已经被有力地证明很难实现的应用程序设计和开发领域,有着强大作用的模式也占了一席之地。从以标准的,基于框架的执行为基础的解决方案分析领域到应用程序的创建,这都是可描述性(和因此而来的连贯性)的一个实质性的进步。

    这是一个简单而又崇高的目标。为了使得软件更加快速的开发和更高的可靠性,IT产业需要学会更有效的再次利用软件的基础构造。为了达到这个目的,我们需要定义目标软件的基础构造使用的可承认的(或可支持的)模式。你可能会潜意识的认识到应该在软件生命周期中引入一个更完善的可描述性内容。因为可描述性内容提供一条正式的通道来转换分析时产品到编译时产品。这是有能力进行前向工程分析的关键。你需要明确将用生成的代码去工作的技术(基础)环境。

    环顾这IT产业中不同的基础构造提案,以及多种技术,很明显的是许多软件的基础构造提供者看起来正在把模式的概念应用到应用程序一般执行的构架当中。在某种程度上,这在IT产业中已经上演好多年了。但是,这一次,基础结构的提供者在应用程序结构上看的很高。这一次,他们正在用应用程序结构帮助构架一臂之力。

    看一看我们今天可以利用什么,传递途径中有什么是清晰的。应用程序结构应该时刻认真考虑到这些问题。这一次,我们拥有基础结构产品和通向功能层基础的工具。而应运而来的是产生了非原创综合病症的克星。这种工具不仅仅是帮助你建模,而且可以通过体系化代码生成来帮助你加速编程。

    想要这种工具吗?那么你就需要用模式来工作,不管是基础结构还是应用层。

    这种IT产业中的运动已经聚集力量好多年了。一个简单的观点应该自然,浅显。

    • 基础结构的模式的位置越高,我们可以重复利用的就越多,也就能使市场商业应用软件拥有更高的品质,更快的开发时间。

    越不简单,则用技术的视角去观察就会发现越冗长的内容。

    • 理解模式,我们能创建支持基础结构。

    • 生产基础结构,我们能创建高生产力的工具来支持基础结构。

    • 把工具交给技术团体,我们将比今天以更快地创造更有可重复性,更高品质的应用软件。

    无处不在的模式

    如果我们在信息科技方面的工作像产业一样和模式紧密相连的话,利用模式工作对于我们大多数来说将成为可能。我们很可能没有意识到模式在我们每天的生活中扮演的角色。但是这是每个普遍升入的对象问题的天性。如果有一样东西到处都是,在经过一个短暂的蜜月期,我们中的大多数人将对他视而不见。特别是跟它跟我们的任务相关并且频繁执行。

    如果它们到处都是,那这对利用模式工作有什么意义吗?我肯定的说,每个人的理解都不一样,但是这篇文章的主旨有两个具体的含义。在设计过程中,利用模式意味着把设计建立在一般事件结构的基础上(设计模式,例如每一个定义已经在“四人帮”丛书——“软件设计模式”中被成功的证明。)。更适宜地使用设计工具能将设计存储为模型表示形式,例如UML。在创建过程中,在真实代码段删节的地方,使用模式意味着使用软件的基础构造产品和工具,包括代码框架和代码生成器(就像Codesmith

    幸运的是,构造的本质和设计提供识别和划分模式的机会。这个被其他作者完成的有价值的工作意味着我不需要在讨论设计中的模式建议的价值了。但是,同样的陈述对于软件生命周期的执行阶段并不是全权委托的,而在执行阶段当中,模式或者是更多特定的构架不幸地染上了恶名。

    构架遭受了“非特殊”的痛苦。应用或者滥用经常有几种不同的途径。为了给可供选择的使用和使用类型提供合理的数字,为了为创建应用程序提供一般的基础服务,构架获得了一个不公平的评价,因为它太复杂。因此很难理解,就像IT职业人员陷入了多种多样的使用方法的泥潭。搞好构架的级别,达到规定性和适应性的平衡已经被证明是一个艰巨的挑战。如果搞坏框架的级别,你就会经常遇到问题。你需要模式来执行基于软件的系统吗?

    这个问题的根本原因很可能是许多应用软件工作组为了更快的生产更高质量的解决方案,而因此也背上了沉重的包袱。很自然的这使得工作组远离了那些潜在的更复杂的方法,也因此可能延长应用程序创建的进程。当工作在这种压力是,没有人会去寻找一个很可能为他们带来更多压力的方法。

    谁想减负阿?

    考虑到压力将带来思想上的问题,那能不能找到一种模式来帮助减轻压力阿?我有一个绝对美妙的想法。回到家,离开喧嚣的人群,隐匿于学习中,查看着当天的电邮,并且试着更新点工作,玩我一直藏在电脑中的智力拼图,所有这些都是良好的感受。瞧,这就是一种很好的模式。

    在很多地方都有模式,从每天的日常例会如何举行,到每日的结束。模式的本质是有天生的,它帮助我们解决困难。一个好的模式能提供复杂数据结构的易懂的描述,同样也可以在帮助我们描述复杂关系。这能使生活更加舒适,并能缓解那些经常要从事复杂工作的人的工作压力。无可否认的,这还能给我们带来很多有用的效果,我们在这篇文章里稍后再研究。

    如果软件的构架和基础结构的使用能被定义为模式,那么元数据将是描述这些模式的语言。因此,描述模式将是元数据的责任。元数据不是一个长期的语言,元数据有很多方言,并且甚至会混杂起来。元数据是描述模式的数据模型的表示的共同项。因此,对于任何一组给定的元数据,它所提供的高质量的描述将由联合的元数据模型决定。

    在这一点上需要提一下,模式不是并且永远不能被限制设计时间。以前,标准,例如统一标准的模型语言和提案(如模型驱动机构),指出许多模型和元数据在工程生命周期中逆流而上。如IBM,像很多大型科技机构一样,在90年代一直致力于使基于UML的总系统的模型形式化。许多这样的提案永远不能成为官方外部的宣传物。但是2003年10月,微软打破了这个僵局,并且发表了他们未解决的系统定义模型(SDM)。利用这些概括了整个系统的模型(如SDM),你将能看到模型驱动,因此元数据驱动处理几乎涉及软件开发生命周期的所有领域。

    通过描述模式来获得功能上的好处,政策和服务抽象

    在设计和创建过程中,或者元数据驱动设计和应用软件开发中,使用元数据将提供一条能完美的支持强大的模式本质的解决方案。因此支持高值软件构架和基础构架产品在市场中是可行的。

    元数据帮助描述你的应用程序领域中的模式。描述(或者模拟)应用程序必须使用的模式将辅助促进软件基础结构的必须提供的特征,以及基础结构最大使用的风格。这就提供了必需和被允许的基础构造的早期可见性,这一基础构造是非常重要的,更安全的,更为可控的环境,在这个环境中,软件的基础结构能在应用程序构造法的层次上走的更远。控制基础结构网更高级别上发展是为应用程序开发者提供更有价值的服务,这给你的应用程序开发者带来了在功能抽象方面的能力进步。

    用模式模拟应用程序的需求(藉由元数据来描述)可能会被应用到几乎所有领域。因此,元数据能被用来描述对象特征到相关表格的映射,从定义相关对象运行时会话管理角色,到特定类对象提供的服务的签名,这种规则构成了应用程序开发者控制基础结构潜在行为的政策定义。

    当认真地,并且正确的模拟你的应用程序时,元数据可以应用于基础结构和应用程序服务分界的描述,以及整合的服务执行的配置数据。随后,和这些服务(还有元数据模型)结合起来的元数据描述可能在你的服务的前提工作中使用,在现存的或者未来的技术环境。这就为服务定义提供了一个充足的,并且可重复使用的方法。

    这样使用元数据,在商业(应用程序)和技术(基础结构)领域,需要在商业分析和软件基础结构之间就元数据模型达成一致。这就达成了应用程序和基础结构之间的行为协议,并且允许了详细的功能分析和并行结构的软件基础机构。在这种情况下,应用软件开发小组可能现在在开发过程中的早期阶段抓住主要问题。而这个阶段是提高软件发展周期效率的关键因素。

    元数据驱动方法和其他主流方法配合的也很好,例如使用条件模型和基于人工的方法论(如合理的统一化过程)。元数据驱动方法有潜力重复利用,并且相对于目标技术平台是独立的。

    技术

    在深入讨论元数据怎么链接面向服务构架和网络服务之前,我们值得花点时间来讨论元数据背后的技术问题

    思考着怎么更好的描述这个问题,我得到一个结论,那就是在一篇技术相关的文章里,不容易叙述。所以,我们就先把它放在那,非常简单,元数据中没有技术。

    元数据本身是一个概念。这就是许多不同元数据模型存在的原因。元数据概念能在很多技术领域内应用,因此,很多软件产品,在商业和技术层次JNDI上有元模型,LDAP和主动目录也是如此。它们都在元模型中使用了相似的概念,但是都有不同的(物理)元数据。

    清楚的是,那些设计和开发产品使用元数据的同时也使用(使嵌入)或者链接(整合)到工具。这些工具通常是图形化的,并且越来越多的被链接到提高开发产品率当中。联系到元数据本身,它有主要的重要性。这种使用和工具的整合对于软件周期里储存的支持,传播和元数据模型的使用可能是设计和创建环境技术中最重要的方面。

    当选择工具协助设计和开发的时候, 最重要的标准经常被集中在:

    • 工具储存和使用元数据的能力,包括他们和你们的设计。

    • 工具共享元数据的能力。这种能力对于帮助减少设计和执行之间的语义差距,在设计时和编译时上很有用。

    • 开发工具和优先的软件基础结构的整合,运行时间平台,尤其是代码生成。

    • 设计和代码生成技术的开发工具的整合,例如脚本语言,可能会被整合元数据模型所使用。

    • 遵从标准(MOF)

    链接SOA和使用元数据的网络服务

    取代写一篇数千字的关于如何在设计和开发中使用元数据的论文是如此之妙。我将尝试另一种选择,一种更技术友好的方法。让我们假设,我们都承认元数据驱动设计和开发很完美。模式是很美妙的,模式决定了我们在IT中所作的大部分。元数据是描述你的模式的好方法,最终元数据在设计和创建中都能使用。

    由于我们都承认,元数据驱动设计和开发非常完美,我们就不需要浪费时间去讨论它的优点了。取代论文,代之以观察我们可以用这种基于SOA和网络服务链接的方法执行什么。

    首先,在继续之前,我要给读者敲一下警钟,例子仅仅就是例子。聚焦在系统元数据应用的反面,不是意味着,一些相同的概念不可以在其他领域应用。许多系统的领域已经使用了接受了的元数据模型,尤其是在鉴定和批准方面是用像Active directory/LDAP这样的产品并且肯定服务管理。

    建议

    经过两个建立在相似原则但不同的执行结果的应用软件例子,我将研究,基于元数据的方法如何能在现有的和新创建的的应用软件上定义服务接口。这个练习的基本目标是将这些接口向附加的使用基础结构整合的技术环境,创建应用程序的基础结构,和在设计阶段建立的元数据模型。

    应用程序举例——共有基础

    在这个经过中,两个应用程序例子表现出了相似的功能角色,并且对外部世界有相似的正面作用。

    由于我正在重点研究核心服务期上的服务接口层,我将做一些关于每一个应用程序执行的假想。第一,应用程序是运行在相同的数据库和数据模型上的——程序2是程序1的备份;第二,我不关心接口状态或者任何中等等级用户的接口部件;第三,我关心任何调度的细节方面或者任何通信机构的配置;第四,服务请求和服务端部分共享的应用部分时和服务器模型相同的,这些部分处理了程序或者运行时间平台的内嵌问题;第五,应用程序的开发是多个小组在数个时间域内进行的。

    实际的(商业)功能性可能在应用程序之间是相似的,程序之间不一样的是表示他们系统边界服务结构的模型。

    程序举例 1 ——原始的,遗传下来的

    服务段原始程序的接口是由C头文件组成的。接口上的每个函数使用量身定制的信号。外部机构通过基于DCE的远程调用程序来调用接口函数。

    增加一个函数相对比较简单,但是和DCE技术连接紧密。增加一个可供选择的访问,来提供函数的non-DCE(不使用DCE)的频道,是不可能离开流程再设计过程的。

    注意到所有服务的数据字典在程序接口上都是公开的。函数名字直接放在程序整体名空间里(它们在小组正在开发的所用函数种必须是独一无二的)。

    AJ1Metadat01

    图一:应用程序 1

    应用程序举例 1 ——发展

    原始程序1稍后通过一组C++类被打包,使得CORBA总线的服务器端接口暴露在外。C++接口不起直接的打包作用,但是,把C函数封装到一组服务中,并且提供统一“一般”的对象作为上下文的请求。

    每一种服务定义一些源于上下文请求类的类,目的是为服务器端基本的C函数需求的参数,创造一组专门的“容器”。

    因此函数被封装到服务中,所有函数的参数定义被一组“容器”类定义封装起来。

    为了更方便的处理这些“更一般的”请求,引入一个新的服务器端(应用程序)组件类型,来核实上下文请求,使得提供的正确参数生效,并把这些参数映射到正确的基本C函数里。请求映射器,是接口定义语言(IDL)中定义的服务执行。一般情况下,并行开发需要在每个IDL服务中有一个请求映射器。但是这个模型也不是系统强迫的。

    为一个现有的服务增加新的函数,需要引出一个新的容器类,需要为映射器增加新的代码来排列容器数据,并且生成基本的C访问。为一个新服务请求增加一个新函数,首先,服务接口应该在IDL中定义,还要穿件一个基于服务接口的映射器。

    注意到所有服务的数据字典直接暴露在程序接口上,但是都被服务和请求上下文定义仔细研究。如图2

    AJ1Metadat02

    2 ,程序 1 发展

    应用程序例 2 ——山丘之王?

    程序1和2的关键区别是程序2是用基于元数据的方法来创建的。程序2没有被限制重复使用现有的C函数。

    程序2中的每一个程序端函数都是建立在一个共同的,用来表示服务请求的元数据模型基础上的。这和发展的程序1在概念上是相似的。但是一般上下文请求的处理被嵌入到服务期代码中了。服务器端函数必须明白一般的上下文请求格式。见图3。

    AJ1Metadat03

    3 ,程序 2

    表示上下文请求时,不需要具体参数。抛开具体的函数信号,在运行时间内,程序2处理上下文请求时,使用了一般的结构。但是,在这个例子中,上下文请求对命名值对的属性包在本质上应该是相似的。道具包能分等级,因此能被用来表示任意数据结构,尤其是基于XML计划基础上的XML文档。

    服务名和请求上下文,是服务器端执行请求的应用程序组件所要求的。和请求上下文许可的数据结构的定义相连接的服务名,在数据库中仍然是“服务定义”。这种定义,是数据库的有效条目,只属于那个唯一的服务。

    系统包括一个新的一般请求处理程序模块。这个模块被设计为,访问元数据库,并实现,新到的,联合服务描述元数据的请求。它同样能创建上下文请求的内存结构来传递到目标服务的执行。

    为程序增加一个新服务在服务器端是很简单的。执行一般接口和完成请求上下文结构,需要服务请求,分配给服务一个名称,注册这个名字,并且需要数据库中的上下文请求描述,以及完成在服务器上配置新服务代码需要的配置行为。

    但在客户端就不一样了。除去确定的客户端头文件,或者程序1中的IDL接口定义,程序2的客户端只通过相同的专业界面连接技术来接收一般的入口点函数。这是一个巨大的改变,在这种情况下,服务数据字典不再直接在服务接口上传播。这些从外部观测到的服务接口,在数据库中都是软件指定的。同样注意到,一个服务定义的范围是和服务执行一一对应的。

    很明显的,程序2遭受了不均衡。服务器端现在很宽松,并且定义的很好;但是用户端在理解服务能提供什么之前,必须先理解元数据。

    进入服务字典的世界。为了使用这些服务,程序2的服务必须是可见的。这通过可靠的文件模式是可以实现的。程序服务的使用者(用户)能阅读接口说明,并且因此建立组织好了的,有效地请求。

    元数据驱动SOA

    明显的,例子程序#2时在系统边界上是十分面向服务的——它不知道其它任何事情——但是说程序#1不支持某些方面上的面向服务的架构也是不公平的。

    程序#1就像是“C”语言或COBOL编写的一些所谓的传统程序。代码可能被更改许多次,但是就当时的技术来说,这些程序本质上是面向服务的。“C”程序有他们的外部函数签名;COBOL程序有他们的拷贝手册。包括一些如IMS或CICS的基础结构,以肯定会有一个面向服务的系统对应这些TP监控器迫使这些模型输入数据块运行请求,然后输出数据块并且利用数据结构来描述这些数据块,这就是一个服务,对吧?

    程序#1和程序#2之间的本质区别是什么?答案(对我而言)是两个都在系统边界面向服务,但是真正的面向服务的程序的不规则碎片模型必须从系统边界到数据库都适用,服务接口对每个模块或子系统都定义好,每个服务对调用者来说都是一个黑盒子。

    无论如何,例子中对系统边界保持注意的行为告诉我们他们之间服务描述的质量是大不相同的。

    • 原始的程序#1无非就是一个开放的库或可执行的终端,通过DCE技术在系统边界开放入口函数签名。

    • 扩展过的程序#1还是一样,但是引入了简单的抽象,有更好的终端描述机制。入口函数被开发成简单的经由CORBA的面向对象的抽象,通过编码配置在抽象和具体的执行间建立联系。

    • 程序#2仅有一个技术终端可以开放。在任和一个技术环境中以相同的方式开放这个终端(通过DCE,CORBA,COM,异步通讯,等等)将会产生同样的结果——数据字典永远不会被公开,仅仅是一般的服务调用签名被公开。这个方法的价值在于使用元数据驱动服务定义和调用那些服务的相关的应用程序基础结构,作为利用各种技术生成被服务广泛使用的多种代理的运行时实现环境。

    如果使用纯技术编码的方法提供对那些服务的访问,程序#2的服务中元数据驱动的特性将导致该方案走投无路。在这样的元数据驱动的程序中开放功能函数被开放元数据代替。

    听起来有些危险,开放元数据的想法?开发元数据本身并不是元数据驱动应用程序的本意。使用元数据来驱动服务在系统边界的传播是一个更为正确的方法。

    从SOA到CORBA,从SOA到Web Services,从SOA到

    为了演示真正的基于元数据的服务设计师如何在竞赛中获胜的,让我们为一些实际的程序例子做一些修改。

    • 我们有基础的服务器端的运行时配置,运行总共三个程序,保持一定状态。

    • 我们打算基于网络服务(Web services)在一项时髦的综合功能中加入一个干净的移植通道。

    • 我们还想在不少通过CORBA综合起来的外部程序和许多程序#1的特定服务之间建立一个移植通道。

    • 有人需要文档,我们就提供给他们。

    • 外部的程序使用程序#2提供的相关服务来移植,需要程序#2和程序#1支持相同类型的CORBA接口

    使用基础结构和代码生成可以更有效率的提供对CORBA和Web services支持(以访问程序#2的服务)。程序#1做不到这一点。如果同样的方法应用到程序#1上,最可能的结果就是要忍受因缺少描述服务的中枢模型而持续增加的复杂性。注意,中枢模型是十分重要的,UDDI中的TModel的概念就是中枢模型(与MSDE或SQLServer使用的物理数据模型相反)。

    使用元数据服务的定义和合适的工具与基础结构环境相联系,元数据驱动的应用程序有能力提供这种搭桥方法来通过代码生成将其服务扩展至许多技术。这是将所有服务都规范起来和用元——格式(一个描述性的格式——即元数据)来描述的一个直接结果,不论在编译时还是运行时。

    设计直接实现 ——将元数据连接到工具

    这个方法需要很多先决的条件,所以这一方法对很多人来说是比较困难的内容。但是如果想简单概括的了解一下,我们需要准备以下的内容:

    • 提供图形界面的建模工具可以帮助我们存储元数据模型和相关的元数据实例(不一定都在同一个物理存贮中)。根据你的应用程序域,通常是类似UML方式的工具,一个过程建模工具或两者合一的。该工具必须提供一个跟他的模型存贮部分可编程的接口。

    • 对目标基础结构产品来说,最好是基于标准的,或一个实际的第三方标准,如果需要也可以是自定义的。这些产品应该提供应用程序需要的技术服务,从存贮保持到过程管理(可能的话对该应用程序的所有层面都进行过程管理)。

    • 支持建模工具和目标基础结构产品间的接口的开发环境工具,并且该接口可编程。

    • 支持代码生成的开发环境工具。如同Lex和Yacc的工具,不是我们考虑的工具类型。支持代码生成需要比一般的表达方式和上下文无关的语法更高层的语法。理想上的,代码生成工具需要收录一些处理元数据的原则,这对降低代码生成的复杂性大有帮助。

    • 一个或两个强的技术领导者,熟悉元数据的概念和使用,由他来驱动该应用程序的开发周期。

    • 一些熟悉元数据建模概念和应用程序基础结构设计的设计师。

    • 一些熟悉如何使用元数据概念的开发人员,他们要和设计师达成一致。

    这些建模工具,基础结构产品和开发环境在如今的市场上都存在。最终的“面向人”是最难满足的先决条件,多数的软件开发组都是一堆人和各种方法的混合,非常容易打破软件的开发周期。

    Belbin教授的测试可以帮助平衡“人员类型”的混合,但是一个一元化的组织并不可以。这在元数据驱动的方法中十分重要,所有的组员都要对模型达成一致,这个应用程序才能达到它的目标。

    综上所述,我们达到了一个解决方案分析可行(有时背需求分析限制)的过程,可以专注于应用程序和其基础结构的设计。应用程序的设计涵盖了组件模型的设计和元数据的定义。应用程序的基础构造通过一系列框架API和标准基础构造的重用或预定制的基础构造对应用程序进行支持。最终,应用程序的加工就是询问这些模型和为应用程序设计的元数据,在应用程序基础构造的上层生成代码。见图4。

    AJ1Metadat04

    4 一个元数据驱动的过程

    编译时

    仔细看一看编译时,并再次注意服务接口,应用程序工具用元数据服务定义来提供服务接口执行的代码生成 (服务代理,在不同的技术环境中)。

    应用程序的元数据被直接用作代码生成。元数据对应用程序的服务的构建十分重要,它构筑了应用程序的基础。生成的代码必须和核心程序基于同一个代码基础(框架)。这帮助你把生成的代码控制到最小容量——代码生成在基础层的顶端。这对减少完全回归测试很有帮助。

    生成的代码的任务是将请求从一个格式(比如来自a CORBA peer的请求,或一个POST网络服务)到一般内部的面向元数据的请求格式。元数据必须包含该服务接口的信息,比如变量类型,名称等,但是可以被扩展以包含默认值和确认。如果在这个脉络下扩展,生成的代理将可以使用跟核心服务相同的确认规则(假设核心服务使用相同的元数据——在本情况下,应该是这样!)。

    一般的基础结构基本上被扩展以支持相关特别的科技(经由系统代码生成)。生成代码需要在底层应用程序基础上定义一个包装器,以配置从一方发往另一方的请求。这是有元数据模型促成的,这个模型定义了服务接口的全局数据表示法。这样做的结果是一个技术环境的底层结构可以独立于代码生成进行测试,这是增加代码生成质量的关键因素。元数据也允许不同的代码生成策略,比如“包含为确认请求而生成的代码”或“不生成确认的代码”。

    AJ1Metadat05

    5 系统的代码生成

    需要保证所有目标环境(由代码生成器连接)的苛刻的请求都在服务元数据模型中详细描述,这是一个代码生成的不利方面。如果不这样,元数据模型就需要修订或扩展以支持目标环境中的不同于本模型的一些概念,也就是说,这样的模型是不完整的。

    来自服务代理的另一个不利方面是版本控制。版本和配置的管理经常是非常痛苦的,需要专门的处理。无论如何,面向代理的版本控制和面向传统开发方法的版本控制并无太大区别。如果一个服务的定义改变,相关的代理需要重新生成,代理相关的综合需要影响评估(本方法的可描述性使得一切都很简单)。其它情况都没什么不同,但是我们要保证核心服务、基础构造和生成的代理都在部署方案中匹配。

    对创造者来说,元数据模型如何被完全利用,没有一个真正的答案。查看标准或许有帮助,但是组织严密、文档翔实的模型更加强壮。幸运的,对后者,从元数据模型中衍生意味着包装和包改变时的影响分析或在相同的基于工具的政策下来进行包装。对代码生成来说,这个构造的确切配置是众所周知的,可以用来组织一个部署仓库。

    运行时

    回到使用元数据驱动的方法设计开发应用程序的最初目的,最好是在运行时来分析回顾一下。

    假设构建过程采用了一个针对元数据服务定义裁减过的通用软件基础架构,同时元数据在创建(编写代码——那没什么神奇的)该程序的核心服务时和生成服务代理时都使用到了,整个解决方案的一致性就像是元数据模型那样完整。

    来自任何支持的外部源的请求都被各自的服务代理做一下配置,在这个配置过程中,依靠使用的代码生成策略,服务代理可能根据元数据提供的一些规则对请求做些确认工作。这可能包括证明,授权和过程管理,从元数据转交给相关代理子系统。

    一旦配置成通用的服务请求格式,请求就被送至请求管理器处执行。执行中,请求管理器对请求进行询问,根据目标(核心)服务的元数据对请求进行匹配。如果全部顺利,目标服务接受请求,并且该服务可能在处理请求时使用额外的元数据。见图6。

    AJ1Metadat06

    6 处理请求

    最终结果是一个解决方案的设计方法,从开始设计到执行。元数据驱动的应用程序比起其他传统程序为什么能有更长的寿命,这又是如何做到的?最终我们提供了一个实际的解释。

    文档

    如果本方法允许从服务定义中生成代码,不生成服务接口规格的文档是没有道理的。这是许多年的实践,使用象Rational Rose(to Microsoft Office Word)的工具进行自顶向下的文档生成,或是使用一些面向代码的工具(比如AutoDuck或JavaDoc)来自底向上的生成。

    适应性

    在这一方法中值得进行一些观察,对组织有关应用的方面做一个基本的概要。在开发中,对元数据驱动的概念来说,刻画出组织的类型,本方法可能同如下相关:

    • 需要在设计和执行中实现更紧密联系的设计者和开发者;

    • 确实看中基础构造驱动,高生产力,高质量的开发方法的组织,

    • 那些不因为一些简单生产力增强工具就满足的组织,

    • 希望建立知识仓库和相关工具以更好的通过一种正式的描述性语言来描述他们的产品的组织。

    • 需要支持更广的技术环境的组织,尤其是在系统边界。

    有帮助么?

    这个方法在许多项目的不同方面都有应用,这些工程有些是我讨论过的,或是参与过的。许多这些项目都想从运行时的模型达到完全的前向模型这样一个高目标,其中一些确实在处理某些特殊领域时做到了。

    在Temenos,我们在制作新的具有24*7能力的一个银行系统(“T24”,在2003年底投入使用)时使用过上述和一些相关的技术。更确切的,我们在制作软件开发工具箱(现有功能上可编程的API)和网络服务部署工具时使用这些技术。这不是很简单,可能时常让你头疼。但是看看T24解决方案的模型,就会清楚地知道:当新的科技浪潮来到时,使用元数据驱动的方法设计开发应用程序会帮你组织好已有的服务,并让其发挥更大的作用。

    仔细分析许多IDE和工具的制作商的动机。元数据表示和代码生成被再一次追求。但是这次目标是通过提供针对如今科技环境的复杂性和抽象性的管理工具,使得开发过程更有效率。

    参考资料

    面向模式的阮家架构:写作与网络对象的模式

    Douglas C Schmidt, Michael Stal, Hans Rohnert and Frank Buschmann, John Wiley & Sons

    反模式

    William J Brown, Raphael C Malveau, Hays W McCormick III, Thomas J Mowbray John Wiley & Sons

    应用 Microsoft .NET Framework 编程

    Jeffrey Richter, Microsoft Press

    .NET 应用架构 , Microsoft Patterns & Practices 小组

    Microsoft Press

    基于组件的流程揭秘 CBDi Newswire Commentary www.CBDiForum.com

    设计模式 Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides, Addison-Wesley

    Dinosaurs Battle in the Tar Pits CBDi Newswire Commentary www.CBDiForum.com

    分布式应用的建模语言 白皮书, Microsoft Corporation

    现代 C++ 设计 Andrei Alexandrescu, Addison-Wesley

    使用 UML 的对象,组件和框架 Desmond Francis D'Souza & Alan Cameron Wills, Addison-Wesley

    SOA精简费用的战略 CBDi Newswire Commentary www.CBDiForum.com

    面向服务流程的本质 CBDi Newswire Commentary www.CBDiForum.com

    计算机编程的结构与解释 Harold Abelson, Gerald Jay Sussman, Julie Sussman, The MIT Press

    展开全文
  • 0001、PC 机与单片机通信(RS232 协议) 0002、C与VB语言联合在proteus上仿真 0003、IC卡读写仿真 0004、Integrate就医服务平台论文 0005、PC红外线遥控器上位机及电路图 ...0007、VB上位机程序控制DS1302时

     

    http://item.taobao.com/item.htm?id=15832996522

    0001、PC 机与单片机通信(RS232 协议)
    0002、C与VB语言联合在proteus上仿真
    0003、IC卡读写仿真
    0004、Integrate就医服务平台论文
    0005、PC红外线遥控器上位机及电路图
    0006、PLC电梯控制系统论文
    0007、VB上位机程序控制DS1302时钟的proteus仿真
    0008、VB上位机与18b20下位机
    0009、八路扫描式抢答器设计论文
    0010、比较全面的手机原理资料
    0011、采用实时时钟芯片DS1302+AT89C2051的红外遥控LED电子钟
    0012、51单片机超声波测距程序
    0013、单片机C语言程序设计实训100例——基于8051+Proteus仿真
    0014、电机转速测量系统论文
    0015、多功能出租车计价器设计论文资料
    0016、多功能数字时钟设计论文资料
    0017、肺活量测量仪设计论文资料
    0018、高保真音响设计制作论文资料
    0019、高灵敏无线探听器电路资料
    0020、给初学51单片机的40个实验汇编语言对应C语言加说明
    0021、国旗升降系统程序及原理图资料
    0022、基于51单片机的电子万年历的设计论文资料
    0023、基于51单片机的数字频率计设计论文资料
    0024、基于AVR及无线收发模块的脉搏监测系统设计论文资料
    0025、基于CPLD的三相多波形函数发生器设计论文资料
    0026、基于DDS的信号源设计论文资料
    0027、基于FPGA多通道采样系统设计论文资料
    0028、基于GSM短信模块的家庭防盗报警系统论文资料
    0029、基于IGBT的变频电源设计论文资料
    0030、基于PLL信号发生器的设计论文资料
    0031、基于PSTN的家用电器远程控制系统设计论文资料
    0032、基于USB的经络信号的检测系统与设计论文资料
    0033、基于USB接口的温度控制器设计资料
    0034、基于单片机的电集中抄表设计论文资料
    0035、基于单片机的简易逻辑分析仪设计论文资料
    0036、基于单片机的数字温度计设计论文资料
    0037、基于单片机的数字钟设计论文资料
    0038、基于单片机的水温控制系统PDF资料
    0039、基于单片机的水温控制系统设计论文资料
    0040、基于单片机的作息时间控制钟系统资料
    0041、基于单片机的温度控制系统论文资料
    0042、基于单片机控制的交通灯毕业设计资料
    0043、基于单片机控制的开关电源论文资料
    0044、基于网络的虚拟仪器测试系统论文资料
    0045、家用音响设计制作论文资料
    0046、具有定时功能的八路数显抢答器的设计论文
    0047、开关电源论文资料
    0048、自来水厂全自动恒压供水监控系统论文资料
    0049、量程自动切换数字电压表proteus仿真+程序资料
    0050、牧场智能挤奶与综合信息管理系统论文资料
    0051、汽车实验台电路控制系统论文
    0052、汽车尾灯控制电路设计论文资料
    0053、抢答器论文及其proteus仿真资料
    0054、全遥控数字音量控制的D 类功率放大器论文资料
    0055、ATMEGA16单片机实现的数控频率计原理图及其程序论文
    0056、数控云台proteus仿真+程序资料
    0057、AT89S52单片机实现数控直流电流源论文资料
    0058、AT89S52单片机数控直流电源原理图程序资料
    0059、数控直流稳压电源完整论文资料
    0060、数控直流稳压电源proteus仿真+程序资料
    0061、数字示波器的制作
    0062、数字式调频收音机设计论文资料
    0063、数字式秒表文档论文资料
    0064、数字万年历设计论文资料
    0065、数字温度计设计论文资料
    0066、水库控制系统设计论文资料
    0067、同步电机模型的MATLAB仿真论文资料
    0068、危险气体泄露报警器设计论文资料
    0069、微型打印机控制电路的设计论文资料
    0070、温度监控系统的设计论文资料
    0071、温度控制系统设计论文资料
    0072、无线调频发射器的设计论文资料
    0073、无线视频监控系统设计毕业论文资料
    0074、无线鼠标设计论文资料
    0075、无线数据收发系统毕业论文资料
    0076、无线遥控盆腔治疗仪论文资料
    0077、无线遥控设计资料
    0078、无线语音遥控智能车论文资料
    0079、消防智能电动车设计与制作论文资料
    0080、悬挂运动控制系统论文资料
    0081、遥控系统的设计资料
    0082、液体点滴速度监控装置资料
    0083、一种智能频率计的设计与制作(AVR)proteus仿真+程序资料
    0084、音频信号分析仪毕业设计论文资料
    0085、应用电子、继电线路设计论文资料
    0086、用单片机实现温度远程显示论文资料
    0087、远程温度控制系统毕业设计论文资料
    0088、正弦信号发生器毕业设计论文资料
    0089、智能风扇调速系统毕业设计资料
    0090、智能台灯设计资料
    0091、智能温度报警系统毕业设计资料
    0092、智能小区安防系统毕业设计论文资料
    0093、智能型充电器的电源和显示的设计资料
    0094、自动加料机控制系统毕业设计论文资料
    0095、自动水满报警器设计资料
    0096、自制实用多功能编程器资料
    0097、综述单片机控制系统的抗干扰设计资料
    0098、多功能数字时钟设计资料
    0099、基于汇编语言的数字时钟
    0100、ENC28j60网络模块设计资料及其程序
    0101、ATMEGA16单片机寻迹小车程序及其原理图
    0102、模块化多功能实训箱实验指导书pdf资料
    0103、0-30V 4A数控稳压电源资料
    0104、16×16点阵(滚动显示)PROTEUS仿真资料
    0105、1.5V~30V 3A可调式开关电源电路原理图+PCB资料
    0106、400HZ中频电源设计毕业论文资料
    0107、32x8 LED点阵屏电子钟设计制作资料
    0108、CDMA通信系统中的接入信道部分进行仿真与分析毕业论文资料
    0109、LC振荡器制作论文资料
    0110、led大屏幕点阵屏设计资料
    0111、MCGS数据采集单片机数据传送的设计资料
    0112、nrf905射频发送电路图和C程序源代码
    0113、PLC控制电梯的设计论文资料
    0114、PLL电路的研究及在信号产生中的应用论文资料
    0115、RCC电路间歇振荡的研究资料
    0116、八位数字密码锁设计资料
    0117、笔记本电脑的智能底座设计论文及其资料
    0118、便捷式单片机实验开发装置毕业设计论文资料
    0119、变压器的智能绕线功能系统毕业设计论文资料
    0120、步进电机调速控制系统设计资料
    0121、步行者机器人设计论文资料
    0122、采集与发射系统设计论文资料
    0123、采用MEC002A制作远程调频发射机论文资料
    0124、仓库温湿度的监测系统论文资料
    0125、常导超导磁悬浮演示试验装置的控制论文资料
    0126、超级点阵,上位机发送单片机显示资料
    0127、宠物定时喂食器设计论文资料
    0128、出租车计价器设计论文资料
    0129、串行通信的电子密码锁论文资料
    0130、单工无线发射接收系统资料
    0131、单工无线呼叫系统设计资料
    0132、单片机-485-PC串口通信proteus仿真+程序资料
    0133、单片机 交通灯设计论文资料
    0134、单片机串行口与PC机通讯资料
    0135、单片机串行通信发射机论文资料
    0136、单片机定时闹钟论文资料
    0137、单片机红外遥控系统设计论文资料
    0138、单片机控制LED点阵显示器毕业设计论文资料
    0139、单片机控制交通灯论文资料
    0140、单片机控制语音芯片的录放音系统的设计资料
    0141、单片机扩展串行通信论文资料
    0142、单片机数字时钟论文资料
    0143、单片机照明灯智能控制器资料
    0144、单片机自动控制交通灯及时间显示论文资料
    0145、低成本可调数显稳压电源(1.3V~25V)proteus仿真资料
    0146、点阵电子显示屏论文资料
    0147、电动智能小车设计论文资料
    0148、电容充放电产生方波,再经积分器转成三角波,再经微分器转成方波proteus仿真资料
    0149、电压检测系统(含VB上位机)proteus仿真+程序资料
    0150、电子秤proteus仿真+程序资料
    0151、电子密码锁1602液晶显示资料
    0152、电子式里程表设计论文资料
    0153、电子万年历设计与制作论文资料
    0154、多点温度检测系统设计论文资料
    0155、多点无线数据传输系统论文资料
    0156、多功能电机控制器设计论文资料
    0157、多功能电子医药盒设计论文资料
    0158、新型消防车的研究毕业设计论文资料
    0159、PICICD2仿真器的原理图与PCB资料
    0160、多功能工业控制平台毕业设计论文资料
    0161、高频电路实训装置毕业设计论文资料
    0162、光纤通信复用技术的研究毕业设计论文资料
    0163、红外遥控电路设计论文资料
    0164、基于51单片机的电力载波通信开关电路的制作资料
    0165、基于AT89S52单片机和DS1302的电子万年历设计资料
    0166、基于AVR单片机的汽车空调控制系统资料
    0167、基于CPLD的三相多波形函数发生器论文资料
    0168、基于IGBT的变频电源设计论文资料
    0169、基于Mini51B的简易数字示波器资料
    0170、基于PLL信号发生器的设计论文资料
    0171、基于单片机的数字电压表论文资料
    0172、基于单片机的指纹识别电子密码锁设计
    0173、基于单片机实现的俄罗斯方块游戏
    0174、基于两个单片机串行通信的电子密码锁资料
    0175、简易智能电动车论文资料
    0176、交通控制器设计论文资料
    0177、汽车尾灯控制电路设计资料
    0178、智能健康监护仪的研究毕业设计论文资料
    0179、BY-5064步进电机驱动芯片资料大全
    0180、THB6064H步进电机驱动芯片资料大全
    0181、THB6128 步进电机驱动芯片资料大全
    0182、THB7128 步进电机驱动芯片资料大全
    0183、THB7128通用电子电路应用400例
    0184、C语言经典算法大全
    0185、D转换中工频干扰的去除
    0186、MODBUS协议中文版
    0187、STM32中文参考手册
    0188、基于DPA425的开关电源的设计与研制
    0189、具有抗工频高二的多路高精度数据采集
    0190、硬件工程师手册_全
    0191、EG8010 SPWM芯片数据手册
    0192、SMK1838遥控接收头
    0193、51+单片机TCP-IP+协议栈ZLIP源码
    0194、电子焊接加工工艺标准PDF
    0195、ENC28j60程序及其资料
    0196、自制太阳能手机充电器设计资料
    0197、自动控制原理资料及其教学课件
    0198、LM628私服驱动PDF资料
    0199、电机控制专用集成电路+(PDF格式)
    0200、人体接近监测
    0201、声光触摸控制延时照明灯电路
    0202、电压电阻转换模块
    0203、电子电路百科全书
    0204、电子电路大全
    0205、电子设计开关电路
    0206、MSP430F149开发板常用经典例程资料
    0207、MSP430449系列16位超低功耗单片机原理与实践原理图例程资料
    0208、MSP430单片机常用模块与综合系统实例精讲原理图例程资料
    0209、MSP430单片机C语言应用程序设计实例精讲原理图例程资料
    0210、抗干扰能力强的反射式传感器
    0211、MSP430F449开发板应用例程资料
    0212、MSP430F149系列单片机基础与实践原理图例程资料
    0213、DY_mini80E 51单片机开发板光盘资料
    0214、51单片机之开发板程序25例带原理图+源码
    0215、AT89S52单片机入门教程30课+程序+说明
    0216、个人学习ATMEGA16单片机应用系统开发经典实例总结21例资料
    0217、个人学习AT89S52单片机应用及其仿真总结46例资料
    0218、VB_上位机编写实例代码集带源码
    0219、PROTEUS软件及教程资料
    0220、PIC单片机PIC16F877例程包
    0221、AT89S52单片机C语言应用100例
    0222、FPGA例程包14例资料
    0223、51单片机典型模块设计实例导航资料
    0224、个人学习ATMEGA8单片机应用及其仿真总结30例资料
    0225、51单片机设计程序30例资料
    0226、AT89S51单片机实例35例汇编+C语言对照带电路图及说明
    0227、常用元件的使用PROTEUS仿真
    0228、AT89S52单片机以及CPLD模块化多功能实训箱实验指导书
    0229、51系列单片机竞赛设计实例程序44例PROTEUS仿真资料
    0230、AVR系列单片机竞赛设计实例程序22例PROTEUS仿真资料
    0231、STC89C52RC单片机学习例程书籍代码资料
    0232、例说STM32 ALIENTEK MINISTM32 实验27例光盘资料
    0233、UC3843控制多路输出开关电源设计与实现
    0234、1.8V 5.2 GHz 差分结构CMOS 低噪声放大器
    0235、40kHZ_超声波测距
    0236、51单片机开发板实验板程序60例汇编及C语言资料带原理图
    0237、12864-12 LCD模块与射频SoC nRF9E5的串行接口设计
    0238、145152频率合成器及其应用
    0239、1.8 GHz CMOS 有源负载低噪声放大器
    0240、AD0809在数据采集中的应用
    0241、AT89C51单片机温度控制系统
    0242、AT89C51单片机在无线数据传输中的应用
    0243、CMOS 混频器的设计技术
    0244、CMOS 斩波稳定放大器的分析与研究
    0245、DDS-PLL组合跳频频率合成器
    0246、DDS波形合成技术中低通椭圆滤波器的设计
    0247、FM调制器(三知杯)
    0248、JDM PIC编程器的原理与制作
    0249、MC1648两种改进型VCO的压控
    0250、MC1648两种基本型VCO的压控特性
    0251、MC145163P型锁相频率合成器的原理与应用
    0252、MSP430超声波测距
    0253、MSP430和nRF905的无线数传系统设计
    0254、nRF905的无线数据传输系统
    0255、N阶多环反馈低通滤波器的系统设计
    0256、PDP 中的模拟视频数字化电路设计
    0257、PWM开关调整器及其应用电路
    0258、RCD箝位反激变换器的设计与实现
    0259、RFID产品几个技术问题的说明
    0260、S51下载线的制作——单片机实用技术探讨
    0261、SL-DIY02-3:单片机创新开发与机器人制作的核心控制板
    0262、TEA1504开关电源低功耗控制IC
    0263、TL494脉宽调制控制电路
    0264、USB接口设计
    0265、步进电机的单片机控制
    0266、采用PROG-110制作的打铃器电路
    0267、超声波测距
    0268、超声波在超声波测距中的应用
    0269、程控信号发生器的设计
    0270、出租车计价器论文
    0271、大功率开关电源中功率MOSFET的驱动技术
    0272、单片机大屏幕温湿度测控电路
    0273、单片机控制红外线防盗报警器
    0274、单片机控制机械手臂的设计与制作
    0275、单片机是怎样在液晶上显示字符的
    0276、单片机学习机及编程器的设计与制作
    0277、单片机在超声波测距中的应用
    0278、单相Boost功率因数校正电路优化及仿真
    0279、单相相位触发器TC782A的设计及应用
    0280、单向无线数据传输系统的设计
    0281、低功耗10Gbs CMOS 1∶ 4 分接器
    0282、电容阵列开关时序优化在A D 转换器中的应用
    0283、电压控制 LC 振荡器
    0284、电压控制振荡器(2004 年吉林省大学生电子设计竞赛)
    0285、电源的分类及知识
    0286、电子学习资料[适合初学者]
    0287、调幅发射机电路的设计
    0288、多参数可调扩频信号源的设计
    0289、多相位低相位噪声5GHz 压控振荡器的设计
    0290、高线性度上变频混频器设计
    0291、反激式电源中电磁干扰及其抑制
    0292、改进的并行积分算法低通滤波器的FPGA设计
    0293、高频试验箱资料
    0294、高清电视音频解码的定点DSP 实现
    0295、反激式DC—DC电源的集成化研究
    0296、高性能DDS芯片AD9850的数字调制系统
    0297、关于单端反激变换器的变压器设计
    0298、焊后热处理温控装置
    0299、获奖作品FM调制器
    0300、基才酒店无线呼叫系统设计
    0301、基于8051单片机制作多光束激光围栏
    0302、基于8051的CF卡文件系统的实现
    0303、基于145152-2芯片的频率合成器的设计
    0304、基于AD9850 DDS 芯片的宽频信号源
    0305、基于AD9850的高频信号源设计
    0306、基于AD9850的正弦信号发生器
    0307、基于DDS的雷达中频信号源设计与实现
    0308、基于DDS技术的MSK调制
    0309、基于FPGA的四阶IIR数字滤波器
    0310、基于FPGA的小功率立体声发射机的设计
    0311、基于MSP430和nRF905的多点无线通讯模块
    0312、基于nRF9E5的无线光标控制系统
    0313、基于nRF905的无线数据多点跳传通信系统
    0314、基于nRF905射频收发模块的设计
    0315、基于nRF905芯片的无线传输设计与实现
    0316、基于nRF905芯片的无线呼号系统设计与实现
    0317、基于nRF2401的无线数据传输系统
    0318、基于PLC的锅炉内胆水温控制系统设计
    0319、基于UC3843的反激式开关电源反馈电路的设计
    0320、基于单片机AT89C51的节拍器的设计与制作
    0321、基于单片机的超声波测距系统
    0322、基于单片机的红外通讯设计
    0323、基于单片机的频率计设计
    0324、基于单片机的数字电子钟的设计与制作
    0325、基于单片机的数字式电子钟的设计与制作
    0326、基于电流控制传送器的电可调梯形滤波器
    0327、基于射频收发芯片nRF903的无线数传模块设计
    0328、基于阶梯阻抗发夹谐振器的小型低通滤波器
    0329、基于电位计实现自行车机器人的拟人智能控制
    0330、基于锁相频率合成器的电压控制LC振荡器
    0331、基于无线传输技术的多路温度数据采集系统设计
    0332、基于准浮栅技术的超低压运放及滤波器设计
    0333、简单实用的通用单片机控制板
    0334、降压/升压DC—DC转换器四开关控制方法
    0335、开关电源原理及各功能电路详解
    0336、可提高Buck型DC/DC转换器带载能力的斜坡补偿设计
    0337、空调室温控制的质量与节能
    0338、宽频带数控频率合成器
    0339、宽频鱼雷自导目标回波模拟仿真
    0340、利用MC145152-2设计吞脉冲锁相频率合成器
    0341、模糊免疫PID在主汽温控制系统中的应用
    0342、浅谈开关电源的过流保护电路
    0343、嵌入式POL DC/DC转换器设计
    0344、射频SoC nRF9E5及无线数据传输系统的实现
    0345、射频模块nRF9E5在污水数据监测系统中的应用
    0346、深井泵自动控制器
    0347、使用PWM得到精密的输出电压
    0348、使用单片机制作的毫欧表
    0349、鼠标:罗技V450激光无线鼠标
    0350、数字化会议系统的分析与设计
    0351、谈开关电源的指标及检测
    0352、通恒电子-开关电源的电路设计
    0353、同步整流DC/DC升压芯片中驱动电路的设计
    0354、下载线+接口电路——制作实用的单片机编程器
    0355、无线呼叫系统的设计
    0356、无线你我他——认识红外线接口
    0357、无线收发芯片nRF905的原理及其在单片机系统中的应用
    0358、无线数传模块及其应用
    0359、无线数据传输系统的设计与实现
    0360、无线智能报警器的设计
    0361、五种PWM反馈控制模式研究
    0362、椭圆滤波器边带优化设计方法研究
    0363、显示测试系统数字I O 口控制的设计与实现
    0364、小型机载计算机电源的设计与研究
    0365、新潮电风扇专用集成电路应用大观
    0366、新型彩色LCOS 头盔微显示器光学系统
    0367、新型单片开关电源的设计
    0368、新型集成电路简化嵌入式POL DC/DC转换器设计
    0369、新型开放式液滴驱动芯片
    0370、新型开关芯片TOP224P在开关电源中的应用
    0371、新一代单片PFC+PWM控制器
    0372、一款新颖的插座式自动温控器
    0373、一种低功耗的锂离子电池保护电路的设计
    0374、一种点对多点无线数据传输系统的设计
    0375、一种基于AT89C51的433MHz无线呼叫系统的设计
    0376、一种基于DDS芯片AD9850的信号源
    0377、一种基于nRF9E5的无线监测局域网系统的设计
    0378、一种精准的升压型DC—DC转换器自调节斜坡补偿电路
    0379、一种无线多点远程监控系统的设计与实现
    0380、一种无线数据传输方案及实现
    0381、一种新的适于集成的模拟温度补偿晶体振荡器的设计
    0382、一种新颖的消除DC-DC中斜坡补偿影响的电路结构
    0383、一种用单片机制作的高频正弦波逆变器
    0384、一种用方波驱动鼠标光标移动的鼠标电路的设计
    0385、应用单片机制作可调超低频方波信号源及程序设计
    0386、用145152实现具有四模数
    0387、用AD9850激励的锁相环频率合成器
    0388、用AT89C51制作四位数字转速测量计
    0389、用AVR单片机制作廉价高性能的多路伺服电机控制器
    0390、用单片机和点阵图型LCD显示屏制作流动图像
    0391、用单片机控制的出租车计价器
    0392、用单片机设计的测速表
    0393、用单片机制作的定时开关控制器
    0394、用单片机制作的直流稳压可调电源
    0395、用单片机制作电池容量测试仪
    0396、用单片机制作多功能水位自动控制器
    0397、用单片机制作多路输入电压表
    0398、用单片机制作温度计
    0399、用单片机制作意大利MEZZERA卷染机计数器
    0400、用微机作单片机调试工具
    0401、用移位寄存器制作步进电机驱动电路
    0402、油田区域网无线综合测控系统软件模块的设计
    0403、有效负载电阻——评估DC/DC转换器效率的新方案
    0404、语音文字短信无线发射机设计
    0405、增量式PID控制在温控系统中的应用
    0406、制作51和CPLD通用下载线
    0407、制作MCS-51串行HEX调试器
    0408、智能化自寻迹程控车模
    0409、智能家用电热水器控制器
    0410、自动检测80C51串行通讯的波特率
    0411、自动温控系统在客车采暖中的应用
    0412、自动洗手器与自动干手器电路
    0413、单片机原理与应用及C51程序设计课件电子教案
    0414、《单片机原理与应用》(金龙国)电子教案
    0415、数字电子系统设计(CPLD)实验指导书资料
    0416、单片机的C语言应用程序设计电子教案
    0417、C语言程序设计及应用实例
    0418、单片机C语言彻底应用实验指导书
    0419、单片机C语言程序设计实验指导书
    0420、单片机常用芯片和器件手册
    0421、单片机应用技术选编
    0422、AT89S52语言常用程序资料
    0423、单片机实验板使用与C语言源程序
    0424、AT89S51实践与实验教程
    0425、8051单片机C语言编程入门指导书
    0426、100个经典C语言程序资料
    0427、单片机典型模块设计实例
    0428、C语言趣味程序百例精解
    0429、30A四路继电器控制板DXP资料
    0430、128x64液晶接线模DXP资料
    0431、555振荡器DXP资料及其相关资料
    0432、AT89S52_AVR入门与提高DXP资料及其相关资料
    0433、AT89S52AVR入门与提高DXP资料及其相关资料
    0434、AT89S52S双L298驱动控制器DXP资料
    0435、AT89S52电机控制器DXP资料及其相关资料
    0436、AT89S52多功能板DXP资料及其相关资料
    0437、AT89S52继电器工控板DXP资料
    0438、AT89S52精简开发板DXP资料及其相关资料
    0439、AT89S52最小系统板DXP资料及其相关资料
    0440、ATMEGA8-ATMEGA16(贴片)DXP资料
    0441、ATMEGA8L最小系统板DXP及其相关资料
    0442、ATMEGA16L最小系统DXP资料及其相关资料
    0443、ATMEGA16单片机模块DXP资料
    0444、ATMEGA128L贴片转直插板DXP资料及其相关资料
    0445、ATMEGA128精简开发板DXP资料及其相关资料
    0446、ATMEGA848-S52-贴片DXP资料
    0447、AVR M8转S52板DXP资料及其相关资料
    0448、AVR M16L转S52板DXP资料及其相关资料
    0449、AVR精简学习板DXP资料及其相关资料
    0450、AVR最小系统板DXP资料及其相关资料
    0451、CP2102 USB转串口DXP资料及其相关资料
    0452、l297_l298组合驱动步进电机DXP资料及其相关资料
    0453、L298N电机驱动器_共地DXP资料及其相关资料
    0454、L297_L298驱动器DXP资料及其相关资料
    0455、L298N直流步进两用驱动器DXP资料及其相关资料
    0456、L6203直流电机驱动器DXP资料
    0457、LCD1602接线模块DXP资料
    0458、LED节能灯电路模块DXP资料及其相关资料
    0459、LM317电压可调模块DXP资料及其相关资料
    0460、LM393声音传感器DXP资料及其相关资料
    0461、LMD18200直流电机驱动器DXP资料及其相关资料
    0462、LMDJ18200直流电机驱动器DXP资料及其相关资料
    0463、mega8_mega16DXP资料
    0464、MPS430F149单片机精简开发板DXP资料
    0465、MPS430F149单片机精简开发板DXP资料及其相关资料
    0466、MSP430贴片转直插板DXP资料及其相关资料
    0467、PIC精简开发板DXP资料及其相关资料
    0468、RS232转485通讯模块DX资料
    0469、S52多功能板DXP资料及其相关资料
    0470、LM2576 稳压模块DXP资料及其相关资料
    0471、S52最小系统 (黑色)DXP资料及其相关资料
    0472、S52精简开发板DXP资料及其相关资料
    0473、STK672-080电机驱动DXP资料及其相关资料
    0474、TCS230颜色识别DXP资料及其相关资料
    0475、THB7128步进电机驱动器DXP资料
    0476、USB下载线DXP资料及其相关资料
    0477、USB下载线—new(黑)DXP资料及其相关资料
    0478、八入八出继电器工控板DXP资料
    0479、八位数码管显示板DXP资料及其相关资料
    0480、变压器电源模块DXP资料及其相关资料
    0481、变压器双12伏双5伏电源板DXP资料及其相关资料
    0482、超声波DXP资料及其相关资料
    0483、超声波测距DXP资料
    0484、传感器控制继电器模块DXP资料
    0485、大功率步进电机驱动器DXP资料及其相关资料
    0486、单红外LM393DXP资料及其相关资料
    0487、单片机USB下载线_直插mega8DXP资料
    0488、定时开关模块DXP及其相关资料
    0489、对射式传感器—计数传感器DXP资料及其相关资料
    0490、对射式深度红外传感器DXP资料及其相关资料
    0491、仿PLC控制器DXP资料及其相关资料
    0492、加速度传感器DXP资料及其相关资料
    0493、精简USB下载线DXP资料
    0494、矩阵键盘DXP资料及其相关资料
    0495、抗干扰红外发射接收一体DXP资料及其相关资料
    0496、两位数码管显示模块DXP资料
    0497、凌阳串口下载线DXP资料及其相关资料
    0498、凌阳单片机最小系统板DXP资料及其相关资料
    0499、频率PWM控制均可调模块DXP资料及其相关资料
    0500、三闪灯DXP资料
    0501、声光双控电路DXP资料及其相关资料
    0502、双红外LM393DXP资料及其相关资料
    0503、双闪灯DXP资料
    0504、四路继电器控制模块DXP资料
    0505、四路输出继电器工控板DXP资料
    0506、万能贴片转直插板_四边DXP资料
    0507、语音麦克输入模块DXP资料
    0508、直流电机专用驱动器DXP资料及其相关资料
    0509、智能颜色传感器模块DXP及其相关资料
    0510、PIC单片机下载线原理图
    0511、PIC单片机原理
    0512、田老师的PIC单片机教案
    0513、手把手教你学单片机PDF资料
    0514、电子学习数字电路教案
    0515、电子学习模拟电路教案
    0516、单片机原理与应用教案
    0517、RC降压原理
    0518、常用集成时序逻辑器件及应用
    0519、第三届“飞思卡尔”杯全国大学生北京科技大学光电一队技术报告
    0520、电感线圈的简易制作
    0521、电工基础-重要
    0522、电机控制专用集成电路+(PDF格式)
    0523、电压电阻转换模块
    0524、电子基础实训的几个实验
    0525、电子元件基础教程
    0526、跟我学模拟电子电路
    0527、跟我学数字电子技术
    0528、开关电路大全
    0529、人体接近监测
    0530、手机充电器电路原理图及充电器的安全标准
    0531、数显实验电源的制作
    0532、数字放大器
    0533、无线电基础知识
    0534、循环彩灯
    0535、运放的应用(摘自OHM丛书)
    0536、智能电力线载波电话系统
    0537、自制太阳能手机充电器
    0538、51单片机C语言编程实验指导书
    0539、《高频电子线路》实验指导书
    0540、《汽车底盘电子技术》实验指导书
    0541、《数字电子技术》实验指导书
    0542、LC与晶体振荡器实验
    0543、SPCE061A单片机教材书及开发板资料光盘
    0544、SPCE061A单片机实验指导书
    0545、STC89C52RC单片机实验板使用手册指导书
    0546、单片机实验板使用与C语言源程序
    0547、单片机语言C51应用实战集锦
    0548、单片机原理与应用实验指导书
    0549、单片及的综合技术应用
    0550、电磁波实验指导书
    0551、电力电子实验指导书
    0552、电子实验指导丛书
    0553、高频电子线路实验
    0554、高频电子线路实验指导书
    0555、高频电子线路实验指导书(电子科技大学中山学院)
    0556、计数器电路应用于自行车
    0557、交通灯控制器设计
    0558、世界十大设计团队的设计策略
    0559、数字电子技术基础实验指导书
    0560、ATMEGA16单片机班培训实例
    0561、通信原理实验指导书
    0562、微机原理及应用实验指导书
    0563、信号与系统实验系统
    0564、压电式压力传感器的静态标定实验指导书
    0565、AVR经典教程
    0566、AVR系列单片机c语言编程与应用实例
    0567、AVR单片机教程0-10
    0568、给初学AT89S52单片机的40个实验
    0569、AVR单片机+CPLD体系在测频电路中的应用
    0570、AVR单片机Atmega128在FPGA配置中的运用
    0571、AVR单片机的SPI串行通信的应用
    0572、AVR单片机例程
    0573、AVR高速嵌入式单片机原理与应用(修订版)
    0574、mega的熔丝位设置
    0575、串口制作
    0576、单片机开发工具DIY AVR单片机并口下载线的制作
    0577、跟我做AVR单片机实验 用单片机做数字频率计
    0578、基于AVR—AT90S8515的多通道智能大厦自动抄表系统
    0579、基于AVR单片机的CAN总线设计
    0580、基于AVR单片机的步进电机控制
    0581、四路12V30A无线遥控控制板DXP资料
    0582、ATmega8原理与应用手册
    0583、基于AVR单片机的串口通信
    0584、基于AVR单片机的矿用智能型电机保护器的研制
    0585、基于AVR单片机的三相正弦波变频电源设计
    0586、基于AVR单片机的远程控制系统的研究
    0587、基于AVR单片机的智能蓄电池巡检系统
    0588、嵌入式C编程与Atmel AVR
    0589、使用并口的AVR单片机串行ISP
    0590、单片机课件
    0591、数字电子实验指导书
    0592、AVR常用单片机芯片中文资料
    0593、AVR单片机C语言开发指导
    0594、avr单片机原理及应用
    0595、AVR高速嵌入式单片机原理与应用
    0596、《AVR高速嵌入式单片机原理与应用》
    0597、《数字电子技术》  电子教案
    0598、《通用集成电路速查手册》
    0599、555集成电路应用800例
    0600、CMOS 4000系列60钟常用集成电路的应用
    0601、单电源运放图解资料手册
    0602、单片机应用技术选
    0603、灯光控制集成电路与灯光控制器制作
    0604、开关电源的设计与应用
    0605、开关稳压电源
    0606、开关稳压电源——原理、设计与实用电路
    0607、实用电子电路大全
    0608、实用电子线路集
    0609、实用家用电器功能扩展器制作
    0610、通信电源新技术与新设备丛书  通信用高频开关电源
    0611、无线电制作精汇
    0612、新型单片机开关电源的设计与应用
    0613、新型单片开关电源的设计与应用
    0614、新型电源
    0615、新型开关电源实用技术
    0616、新颖开关稳压电源
    0617、新颖实用电子设计与制作
    0618、制作你自己的爬虫机器人
    0619、1-100分钟定时器电路
    0620、1.5V-35V可调直流电源制作
    0621、1分钟—20小时定时器电路
    0622、4路抢答器
    0623、5V→30V转换电路
    0624、6V胶质电池充电器
    0625、8路抢答器
    0626、8通道红外遥控电路
    0627、10位数字密码锁
    0628、12秒—90分钟定时器电路
    0629、74HC14组成的方波振荡器
    0630、440Hz窄带(5Hz)声控开关
    0631、500kHz简易频率计
    0632、555测试电路
    0633、555单通道调制电路
    0634、555定时器
    0635、555振荡器
    0636、555组成的10分钟定时器
    0637、555组成的“投硬币”电路
    0638、555组成的单稳态多谐振荡器
    0639、555组成的电源检测报警电路
    0640、555组成的定时电路
    0641、555组成的非稳态多谐振荡器
    0642、555组成的光暗报警电路
    0643、555组成的光线亮暗检测报警器
    0644、555组成的节拍器
    0645、555组成的脉冲失落检测电路
    0646、555组成的脉冲整形电路(施密特触发器)
    0647、555组成的倾斜检测报警器
    0648、555组成的双音报警电路
    0649、555组成的提醒音发生电路
    0650、555组成的载波振荡器
    0651、4040B组成的LED显示计数器
    0652、14093组成的脉宽调制器电路(电机调速)
    0653、CMOS单通道调制电路
    0654、DC-AC变换器
    0655、DC-AC变换器LCD显示电子温度计
    0656、DC-AC变换器PWM控制式电机速度控制电路
    0657、DC-AC变换器TC4069UB组成的方波振荡器
    0658、DC-AC变换器按钮型游戏基准电路
    0659、DC-AC变换器变形多谐振荡器
    0660、DC-AC变换器标准多谐振荡器
    0661、不规则变换循环LED闪烁电路
    0662、采用3524的PWM式电机速度控制电路
    0663、超声波鱼缸加氧器
    0664、车辆转向灯电路
    0665、出租车空车灯LED环形闪烁电路
    0666、触摸调光灯
    0667、触摸开关
    0668、触摸控制定时器
    0669、触摸控制转换开关
    0670、串联式多谐振荡器
    0671、串入式声控延时开关
    0672、单结晶体管多谐振荡器
    0673、单脉冲控制转换开关
    0674、单脉冲控制转换开关基本电路
    0675、单稳态多谐振荡器
    0676、单稳态多谐振荡器组成的定时器电路
    0677、单轴操纵杆接口电路
    0678、低电平输出光控电路
    0679、第三刹车灯电路
    0680、电场与漏电检测器
    0681、电动车充电自动控制电路
    0682、电话机检修测试仪
    0683、电话检修仪
    0684、电子节拍器
    0685、电子锁
    0686、电子音乐门铃
    0687、短波无线监听发射器1(100MHz)
    0688、短波无线监听发射器2(100MHz)
    0689、短路检测式报警电路
    0690、断线检测式报警电路
    0691、断线式防贼报警电路
    0692、断续音报警信号发生器
    0693、多功能密码锁
    0694、多谐—张弛振荡器
    0695、发射极耦合式多谐振荡器
    0696、方波发生器
    0697、非对称多谐振荡器
    0698、峰谷用电定时器
    0699、改进型发射极耦合式多谐振荡器
    0700、改进型模拟PUT(可编程单结晶体管)器件振荡器
    0701、高电平输出光控电路
    0702、故障寻迹器
    0703、光照不足报警检测电路
    0704、恒温器控制电路
    0705、红外遥控发射接收电路
    0706、互补式多谐振荡器
    0707、花样彩灯控制电路
    0708、基本型发射极耦合式多谐振荡器
    0709、简单无线电遥控发射接收电路
    0710、简易无线电子琴
    0711、接近报警器
    0712、金属探测器
    0713、晶体管组成的多谐振荡器
    0714、警笛声报警器
    0715、警笛声发生器
    0716、九路编解码电路
    0717、居室防盗报警器
    0718、具有脉冲指示的逻辑探头
    0719、具有遥控功能的负载保护器
    0720、具有音响指示的逻辑探头
    0721、8通道电子开关电路
    0722、快速上升时间多谐振荡器
    0723、宽范围压控振荡器
    0724、宽容限多谐振荡器
    0725、宽容限线性多谐振荡器
    0726、连续报警音发生器
    0727、流水彩灯
    0728、六路编解码电路
    0729、逻辑测试笔
    0730、脉冲触发定时器电路
    0731、脉冲丢失检测器
    0732、脉冲发生器
    0733、脉宽调制器电路(电机调速或调光)
    0734、门灯自动光控制定时开关
    0735、模拟ON-OFF开关
    0736、模拟PUT(可编程单结晶体管)器件双稳态电路
    0737、模拟PUT(可编程单结晶体管)器件振荡器
    0738、模拟SBS(硅双向开关电路)电路
    0739、模拟脉冲计数器
    0740、莫尔斯电码练习器
    0741、鸟鸣报警器
    0742、汽车电压调压器
    0743、强制锁存电路
    0744、去极化镍镉电池充电器
    0745、三色交通灯模拟电路
    0746、三相位方波振荡器
    0747、声光报警信号发生器
    0748、声光电子节拍器
    0749、施密特触发器
    0750、数字拨盘(旋转编码器)
    0751、数字电压表
    0752、双向来访人数监测器
    0753、水泵自动保护电路
    0754、水质检测仪
    0755、四路编解码电路
    0756、通用红外遥控开关
    0757、往返式流动灯
    0758、物体运动检测电路
    0759、线路通断测试器
    0760、信号发生器
    0761、延迟触发叮咚门铃
    0762、延时接通继电器驱动电路
    0763、液面检测器
    0764、音控开关
    0765、音乐声光报警信号发生器
    0766、隐蔽电线线路查找信号发生器(用收音机监听)
    0767、用555电路组成的DC-AC变换器
    0768、用分离元件组成的逻辑电路
    0769、鱼缸水循环自动控制器
    0770、照明灯延时控制电路
    0771、照明过暗提醒电路
    0772、自动关断继电器驱动电路
    0773、A D转换器
    0774、LED显示器接口电路
    0775、步进电机及驱动电路
    0776、超声波传感器与应用电路
    0777、触模式5档电风扇
    0778、单片机组成的声音报警输出电路
    0779、电流一电压变换电路
    0780、电压一频率
    0781、电子灭蝇器
    0782、电子筛子
    0783、电子胸花
    0784、多变流水灯控制电路
    0785、固态继电器电路
    0786、光电传感器与应用电路
    0787、光控式道路施工闪烁警示灯控制电路
    0788、光控照明灯自动开关
    0789、红外测量控器的发射与接收
    0790、红外探测自动开关
    0791、直流电动机驱动接口电路
    0792、红外线集成器件sNS9201在延时开关中的应用
    0793、霍尔传感器与应用电路
    0794、继电器电路
    0795、家用彩色幻灯电路
    0796、简单实用触模式报警器
    0797、简单实用的可控硅无级调光器
    0798、课程设计任务书-数字秒表
    0799、六路循环彩灯控制电路
    0800、模拟自然风无级调适电风扇控制电路
    0801、燃气炉全自动点火电路
    0802、闪光的摆
    0803、神奇旋转彩灯电路
    0804、声光双控延迟照明灯
    0805、声音报警电路
    0806、实用灯控节能开关
    0807、实用时基电风扇模拟自然风控制电路
    0808、实用无级触摸调光灯电路
    0809、双向超沮报警器
    0810、无干扰电风扇自然风控制器
    0811、无线电编码遥控4级调光灯开关
    0812、一种人体热释探测电路
    0813、有源滤波电路
    0814、增益电路
    0815、增益可自动变换的放大器设计
    0816、常用电子元器件芯片资料

    http://item.taobao.com/item.htm?id=15832996522
    展开全文
  • 特别声明:本系列文章LiAnLab.org著作权所有,转载请注明出处。作者系LiAnLab.org资深Android技术顾问吴赫老师。本系列文章交流与讨论:@宋宝华Barry ...Android应用程序开发以及背后的设计思想深度剖析(2)
  • 特别声明:本系列文章LiAnLab.org著作权所有,转载请注明出处。作者系LiAnLab.org资深Android技术顾问吴赫老师。本系列文章交流与讨论:@宋宝华Barry ...Android应用程序开发以及背后的设计思想深度剖析(1)
  • C++Builder 数据库程序设计开发详解

    千次阅读 2004-12-06 19:38:00
    今天是2004年12月6号,从今天开始,我的blog将陆续发表我在BCB数据库开发程序中的应用心得与详细开发指导。所用开发环境:C++ Builder 5.0第一篇:BCB与数据库的关系 很多人开发数据库应用程序存在一个概念模糊的...
  • 程序与云开发实战 36 讲

    万次阅读 多人点赞 2018-11-06 11:49:05
    程序依托微信超过 10 亿的海量用户,它无需安装即可使用的完美用户体验,已经成为商家竞相争夺的大蛋糕,同时,小程序开发快速、容易部署广受程序员的喜爱,作为程序员的我们,还有什么理由不学习小程序开发呢?...
  • 微信小程序直播开发

    万次阅读 多人点赞 2018-05-31 15:15:28
    微信小程序直播怎么开发,本篇教程带你了解小程序直播开发中的秘密。大家有没有发现,小程序直播的方式在我们身边的会议、客户服务、约会中应用得越来越多……看到这些,不少开发者就着急了:怎样才能开发出例如小...
  • 程序开发常见需求

    千次阅读 热门讨论 2018-12-11 14:11:58
    最近有独立开发了一个粉丝经济类的小程序,由于产品和后台对小程序都陌生,以及自己开发经验的欠缺,所以总结一下自己开发过程中所遇到的问题以及踩到的坑。 第一个:关于openid的问题---前端让后台传,不要自己...
  • Web应用程序开发方法研究

    千次阅读 2012-09-07 15:25:16
    Web应用程序开发方法研究   摘要:如今已进入了web2.0高速发展的网络时代,各种基于互联网的Web...总结了Web应用程序开发的一般步骤,提出了将软件复用技术,经典设计模式、开源框架合理应用于程序开发以达到高效开
  • 嵌入式系统开发设计——按键控制LED灯实现

    千次阅读 多人点赞 2020-06-19 21:31:16
    3.基于固件库编程控制GPIO端口的输出,进而控制LED灯的显示状态。 三.实验设备及工具 硬件:PC机,安富莱_STM32-V5开发板,ST-Link V2仿真器 软件:STM32官方库;PC机WINDOWS系统操作系统;KEI
  • delphi 应用程序开发工具

    千次阅读 2016-07-07 15:02:20
    应用程序开发工具 Delphi,是Windows平台下著名的快速应用程序开发工具(Rapid Application Development,简称RAD)。它的前身,即是DOS时代盛行一时的“BorlandTurbo Pascal”,最早的版本由美国Borland...
  • 嵌入式软件开发程序架构(一)

    千次阅读 多人点赞 2019-02-17 18:00:41
    该内容是工作一年来通过上网或其他方式不断搜索、实践、总结出来的嵌入式软件开发经验(本文仅适用于单片机的裸机开发),希望...在嵌入式软件开发过程中,程序架构的搭建尤为重要,下面介绍三种常用的程序框架设计方案
  • 零基础入门微信小程序开发 (2020 版)

    万次阅读 多人点赞 2020-02-19 23:30:02
    就算你完全没有开发过微信小程序,甚至没有接触过小程序的相关技术(XML、JSON、JavaScript 等)也可以轻松入门! 涵盖开发全周期,助你尽快完成自己的小程序: 麻雀虽小,五脏俱全。专栏通过 9 篇文章覆盖从开发...
  • 开发APP、微信小程序、网页,都需要什么?

    万次阅读 多人点赞 2020-05-05 14:49:17
    个人开发APP,微信小程序,网页都需要什么?准备工作前端开发后端开发技术整合打包上线结语 在开始介绍之前,我先罗列一下APP,微信小程序,网页的大比较 准备工作 云服务器,域名(需备案),SSL证书 云服务器...
  • 微信小程序经典案例开发(微信开发)

    千次阅读 2018-08-03 15:49:09
    课程介绍:非常值得推荐的一套微信小程序开发视频教程,来自极客学院全套的微信实战开发程序,值得学习-------------------课程目录-------------------├&lt;; Part1&gt;│ ├1.1微信小程序从基础到实战...
  • 知识库微信小程序开发

    千次阅读 热门讨论 2016-11-21 17:55:10
    11月,CSDN知识库研发负责人尚林凯在厦门进行了微信小程序开发的分享。在1个小时的分享时间里,谈到小程序开发给技术人带来的影响,如何去开发程序,以及在开发过程中踩过的那些坑。什么是小程序程序是微信推出...
  • 用Vue开发程序的框架

    万次阅读 2017-12-06 15:10:23
    微信小程序推荐简洁的开发方式,通过多页面聚合完成轻量的产品功能。小程序以离线包方式下载到本地,通过微信客户端载入和启动,开发规范简洁,技术封装彻底,自成开发体系,有 Native 和 H5 的影子,但又绝不雷同。...
  • 5步完成物联网小程序开发

    千次阅读 2020-10-31 14:37:48
    业务完全可以以小程序为核心,例如小兔健康小程序,在小程序里就能实现产品购买、配网、控制管理的闭环。 为此,涂鸦推出了 Tuya-Weapp-CloudBase SDK(以下简称小程序 SDK), 结合腾讯云函数,让您可以快速高效的...
  • 微信小程序后台开发详解

    万次阅读 多人点赞 2018-06-18 03:54:20
    微信小程序后台开发 前言 开发环境 开发流程 项目整体结构 接口开发 项目部署 ip映射 Nginx反向代理 gunicorn+super多进程开启服务+进程监控 ssl证书 小程序常用功能 微信支付 生成二维码 推送消息 测试 黑盒...
  • 本书全面介绍了delphi程序开发所用到的技术和技巧,共分19章,内容包括窗体与界面设计、控件应用、数据处理技术、图形技术、多媒体技术、文件系统、操作系统与window相关程序、注册表、数据库技术、sql查询相关技术...
  • 嵌入式软件开发程序分层(二)

    千次阅读 多人点赞 2019-03-03 12:19:11
    在嵌入式软件开发过程中,在程序架构的搭建完成之后,为了提高项目代码的可读性和可维护性等,应对程序代码分层
  • 软件开发管理与质量控制

    万次阅读 2018-11-12 19:51:48
    软件开发管理与质量控制
  • 微信小程序:三个月学习开发实录

    千次阅读 2018-08-10 16:08:41
    一、引言 因为工作的原因,我接触到了微信小程序。...一方面来源于兴趣,另一方面来源于”玩“的心态,我接下了新员工课题中微信小程序端的开发任务。这是一个非常简单的小程序,对于需求方来说,就是一个...
  • 浅谈软件开发项目的质量控制

    千次阅读 2018-04-19 13:08:14
    由此,DonaldReifer 给出软件质量控制的定义:软件质量控制是一系列验证活动,在软件开发过程的任何一点进行评估开发产品是否在技术上符合该阶段制定的规约。 二、软件缺陷分析 在IEEE 1983 of IEEES tandard729 ...
  • 嵌入式系统开发设计---嵌入式系统开发设计

    万次阅读 多人点赞 2018-09-20 07:42:01
    嵌入式系统设计的主要任务是定义系统的功能、决定系统的架构,并将功能映射到系统实现... 嵌入式系统的设计方法跟一般的硬件设计、软件开发的方法不同,是采用硬件和软件协同设计的方法,开发过程不仅涉及软件领域...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 241,168
精华内容 96,467
关键字:

产品设计开发控制程序