golang实现字符串逆序,不允许临时变量的原地逆序

2013-04-06 Golang

package main

import (
	"fmt"
)

var (
	s1    string
)
func main() {
	fmt.Println(s1)
	fmt.Println(converString(s1))
}
func init() {
	s1 = "我爱你waylau.com"
}
func reverseString(s string) string {
	str := []rune(s)

	for i, j := 0, len(str)-1; i < j; i, j = i+1, j-1 {
		str[i], str[j] = str[j], str[i]
	}

	return string(str)
}

后台输入为

我爱你waylau.com
moc.ualyaw你爱我


Flex的一些总结

2013-03-26 Flex

##Loader与URLLoader,SWFLoader

(1) Loader Loader 类可用于加载 SWF 文件或图像(JPG、PNG 或 GIF)文件。 使用 load() 方法来启动加载。 被加载的显示对象将作为 Loader 对象的子级添加。 (2)URLLoader URLLoader 类以文本、二进制数据或 URL 编码变量的形式从 URL 下载数据。 在下载文本文件、XML 或其它用于动态数据驱动应用程序的信息时,它很有用。URLLoader 对象会先从 URL 中下载所有数据,然后才将数据用于 ActionScript。 它会发出有关下载进度的通知,通过 bytesLoaded 和bytesTotal 属性以及已调度的事件,可以监视下载进度。在加载非常大的视频文件(如 FLV 的视频文件)时,可能会出现内存不足错误。

区别:一个用来加载可显示数据,一个用来加载非显示数据因为loader是继承与容器类的,所以首先它是个容器,而URLLoader 是继承与EventDispatcher,它不是容器URLLoader 类以文本、二进制数据或 URL 编码变量的形式从 URL 下载数据,在加载非常大的视频文件(如 FLV 的视频文件)时,可能会出现内存不足错误,返回的数据在data属性里面而loader多加载图片,swf等可视化对象,加载后作为唯一的子对象显示在列表上。

应用范围 Loader: 多用于swf,图片(jpg,png,gif) URLLoader: 多用于文本文件(xml,php,jsp…) 使用方法

    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete); 
    private function loadComplete(event:Event)
    { 
        trace("done");
        addChild(loader);
    }

    //URLLoader:
    xmlLoader.dataFormat=URLLoaderDataFormat.TEXT; 
    xmlLoader.addEventListener(Event.COMPLETE,xmlLoaded); 
    private function xmlLoaded(event:Event) { 
        try {
            myXML = XML(event.target.data);area.text=myXML;
        }catch (e:TypeError) 
        {
            area.text="Load faild:\n"+e.message;
        } 
    }  Loader 在使用Loader来加载数据时,添加侦听事件时,注意一定要给Loader的 contentLoaderInfo属性增加事件,而不是给Loader对象增加事件。
 var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler); loader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITYERROR, securityErrorHandler); loader.contentLoaderInfo.addEventListener(IOErrorEvent.IOERROR, ioErrorHandler);

(3)可以使用SWFLoader和Loader两个类来加载子应用程序,多数情况下我们使用SWFLoader。它是Loader的一个包装类,提供了很多附加功能,使加载子应用程序更简单。 SWFLoader有如下特征: 支持flex的样式和特效;而Loader类却不支持任何固有的样式和特效。 方便管理加载进度;如果使用Loader则首先要获取LoaderInfo引用。

是一个UIComponent组件。SWFLoader它自己管理了所有子显示对象,不需要添加多余的代码。 自动缩放显示内容的大小

可以加载Application以外的实现类,如果检测到不是一个Application,会自动进行处理。 可以处理不同的版本。Loader不支持加载不同的编译版本

当使用Loader加载不是受信任区域的swf时,必须提供一个遮罩来重新定位,否则它会显示在屏幕外面: 代码 import flash.display.*; import flash.net.URLRequest; var rect:Shape = new Shape(); rect.graphics.beginFill(0xFFFFFF); rect.graphics.drawRect(0, 0, 100, 100); addChild(rect); var ldr:Loader = new Loader(); ldr.mask = rect; var url:String = “http://www.unknown.example.com/content.swf”; var urlReq:URLRequest = new URLRequest(url); ldr.load(urlReq); addChild(ldr);

SWFLoader加载外部swf是一个很好的方法,在进行Flex游戏开发的时候,我们通常会需要很多Flash提供的游戏角色,这些角色可以每个都是一个单独的swf,也可以是存在于一个swf文件中的各个元件。两种方法各有优劣: 1. 单独的swf,每个角色独立性很强,可以在需要的时候才加载。未来修改角色也不会影响到其它角色。但是会有很多的swf需要管理。 2. 每个角色是一个元件,存在于一个swf中,这种方法比较容易管理资源,比较干净。但是修改一个角色都需要重新编译swf,可能会误操作影响其它的元件。而且一次加载所有角色,可能会加载许多不必要的元件,浪费带宽。

两种方法怎么选择,根据项目读者根据以下几个问题考虑: 1. 你的所有元件相互之间是否又很多公用元件?如果是的话,可以考虑放到一个swf中,因为这样会降低所有元件的文件量。 2. 你的所有元件是否都继承同一些类,实现同一些接口,调用同一些类?如果是的话,可以考虑放到一个swf中,这样比较容易管理类包,而且降低swf的文件量,因为共有的类只编译一次。 3. 你的所有元件是否完全独立,没有任何关系?如果是的话,你可以考虑每个角色独立的swf。 具体实现代码如下:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
               creationComplete="init()"
               >
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <fx:Script>
        <![CDATA[
            import mx.controls.SWFLoader;
            import mx.core.UIComponent;

            private var swfLoader:SWFLoader = new SWFLoader();
            private function init():void{
                swfLoader.addEventListener(Event.COMPLETE,swfLoadComplete);
                swfLoader.load("assets/fishmomo.swf");
            }
            private function swfLoadComplete(e:Event):void{
                /**
                 * 将整个swf都加载到flex舞台上
                 * 此方法将每个flex要用的资源做成单独的swf,需要时才加载进来
                 */ 
                addElement(swfLoader);
                var swf:MovieClip = swfLoader.content as MovieClip;
                //fish 是 swf主舞台上的一个鱼对象,属性命名为fish
                //调用舞台上fish元件的say方法
                swf.fish.say("Load a swf");

                /**
                 * 此方法可以把所有的flex要用的资源放到一个swf中
                 * 把需要在flex中使用的元件链接到一个类,并将此元件拖到flash舞台
                 * 通过类名,随意显示其中一个元件到flex舞台
                 */ 
                var FishSymbol:Object = swfLoader.content.loaderInfo.applicationDomain.getDefinition("Fish");
                var f:MovieClip = new FishSymbol() as MovieClip;
                //调用元件的say方法
                f.say("Load a symbol within a swf");
                var ui:UIComponent = new UIComponent();
                ui.addChild(f);
                addElement(ui);
            }
        ]]>
    </fx:Script>
</s:Application>

##导致内存泄露的一些情况:

事件监听: 对父级对象加了监听函数,会造成内存泄露,例:

override protected function mouseDownHandler(…):void { 
systemManager.addEventListener(“mouseUp”, mouseUpHandler); …… 
}  解决: 在销毁对象的时候,remove掉这些监听,虽然弱引用也可以避免这些问题,但自己掌控感觉更好。 但以下几种情况不会造成内存泄露: 弱引用:

someObject.addEventListener(MouseClick.CLICK, handlerFunction, false, 0, true);  对自己的引用:

this.addEventListener(MouseClick.CLICK, handlerFunction);  子对象的引用: 

private var childObject:UIComponent = new UIComponent; addChild(childObject); childObject.addEventListener(MouseEvent.CLICK, clickHandler);  总之…有addEventListener,就removeEventListener一下吧,要为自己做的事负责~哈哈

清除引用 remove掉子对象后并不会删除该对象,他还保留在内存中,应该将引用设置为null removeChildren(obj); obj = null;

静态成员 Class (或MXML)中有: public static var _eventService : MyService=new MyService(); 解决:在dispose时,需要设置: _eventService =null;

module (未解决) moduleLoader unloadModule后 ModuleInfo 并不会被GC. Garbage Collection in a MultiCore Modular Pipes Application 这篇文章介绍了一种GC策略,感觉对于ModuleInfo 的GC无效。 (未尝试、未遇到)

CSS样式 module 中如果使用了shell的CSS定义或是 这样的定义,那么这个module将不能GC. 弹出的窗口应该是同样的结果. 解决方法,使用动态CSS文件 module init中 StyleManager.loadStyleDeclarations(“css/myStyle.swf”); module dispose中 StyleManager.unloadStyleDeclarations(“css/myStyle.swf”);

TextInput/Textarea(未解决) 如果module中有window使用了TextInput/Textarea控件,不点击没有问题,只要点上去,那么很遗憾了,module和所在窗体将不能被GC. 这个BUG非常严重,目前还没有解决方法。 memory leak when using TextInput and TextArea when click the keyboard 这里面附加的解决方法无效。 通过profiler分析,应该和Focusmanager有关,只有一点击就不会释放。

CursorManager.setCursor 使用了 cursorID = CursorManager.setCursor(iconClosed); dispose时要 CursorManager.removeCursor(cursorID);

Bitmap 如果使用Bitmap,结束时需要调用其dispose方法,否则内存消耗巨大。 另外,BitmapData是可以共享使用的,多个Bitmap可以使用同一BitmapData,节省不少内存。 var bmp:Bitmap =new Bitmap(); …….. if (bmp.bitmapData!=null) { bmp.bitmapData.dispose(); } Image 包含了Image对象时,在removeChildren时会造成不能释放(测试多次,结果不一,建议还是做如下处理)。 解决: img.source = null; this.removeChild(img); img = null;

Loader、SWFLoader、声音、视频、Effect等… 如果是加载SWF文件,先停止播放。 停止声音的播放 停止正在播放的影片剪辑(Movieclip) 关闭任何连接的网络对象,例如Loader正在加载,要先close。 取消对摄像头或者麦克风的引用 取消事件监听器 停止任何正在运行的定时器,clearInterval() 停止任何Timer对象,timer.stop() 停止正在播放的效果(Effect) 其他

binding也疑似有memory leak 问题。 引用以及内存泄露相关博文和资料: http://blogs.adobe.com/aharui/2007/03/garbagecollectionandmemory.html http://www.craftymind.com/2008/04/09/kick-starting-the-garbage-collector-in-actionscript-3-with-air/ http://www.cnblogs.com/janyou/archive/2008/11/25/1340753.html http://www.dreamingwell.com/articles/archives/2008/05/understandingm.php 总结:由于之前Flash一直是在网页上使用,一般网页都是看完就关掉的,估计Adobe在内存回收这块也没有下太大的功夫, 现在AIR的出现使得内存管理也相当重要了,并且,AIR本身对内存的消耗就相当大,一个没有任何内容的初始创建的AIR程序,就得占掉10-20M+的内存…AIR还需改善.

##Modules

为什么要模块化;模块化提供了分离应用程序代码到不同的swf文件上以便减少下载时间和文件大小。 使用Modules的好处是:

  1. 主应用程序开始时不需马上下载modules。应用程序会根据需求载入和卸载modules。

  2. 由于每个modules独立于其他应用程序modules,当需要改变一个modules时,你只需要重编译这个modules而不是整个应用程序。模块化可创建模块化应用程序是提高Flex框架性能的重要方面,提供更多能力控制下载时间和文件大小,使用modules,你可以根据哪些可被独立载入,哪些可被其他程序使用而分离应用程序代码。

优点是合理分割了主Application,模块化开发。更小的SWF文件体积,配合RSL和延迟加载策略,大大减少用户等待时间。

缺点就是容易引起内存泄露。

##RSL

RSL(Runtime Shared Library),即运行时加载库。当前L主要有3个级别的RSL,一个是Standard RSL(即一个网站内共享),一个是Cross-domain RSL(跨域共享),最后一个也是最关键的是Framework RSL(Flex框架共享)。 功能说明 Flex Builder在默认情况下,编译的每个程序都是独立的。每个程序都包含了所需类的一个副本,例如:在多个程序中都用到了VBox这个控件,那么每个程序都要独立的拥有一个VBox类。由此造成了程序代码的重复,使得代码量增大很多。而RSL正是解决此问题的一种方法,它可以把共享代码提取出来,然后在相同域的程序之间进行共享。这些共享代码不会再编译进程序,而是放在单独的库中,供运行时加载。另外,RSL也可以在客户端进行缓存,因此不需要在每次使用程序时重复下载。

RSL(Runtime shared libraries)即动态链接库,在程序运行时由FlashPlayer动态加载。静态链接库是SWC文件,通过编译器的library-path和include-libraries 编译进应用程序。采用静态链接的应用程序SWF会产生比较大的文件以及更长的下载时间。使用RSL的应用程序载入时间短且文件比较小,而且提高了内存使用效率,只是 在开始需要花点时间下载RSL。RSL的强大体现在多个应用程序共享公共代码时,因为RSL只需要被下载一次,多个应用程序动态链接到相同的RSL,访问其中已经缓存在客 户端的资源。 使用RSL: (1).在项目文件夹中点右建,选择”properties”-“Flex Build Path”-“Library Path” (2).该选项卡上我们看到”FrameWork linkage”,默认是”Merged into cdoe”(FLEX4默认是RSL) (3).点开下拉,选择”runtime shared library(RSL)” (4).针对自定义的SWC,修改其link type为RSL,选择None,同时勾上Automatically extract swf to deployment path(自动将SWF提取到部署路径)。如果想对不同域的RSL共享,则选择Digests(摘要),同时指定其Policy file url(策略文件)。具体可参考FLEX SDK中的SWC文件处理方式。 (5).点击OK

##SWC

SWC 文件是类似 zip 的文件。静态链接库是SWC文件,通过编译器的library-path和include-libraries编译进应用程序。新建Flex Library Object或使用compc命令可以制作SWC。

##E4X E4X是在ECMA-357标准中定义的,并成为AS3的一部分。优点是提供更简明和可读性强的语法从XML中查找和提取数据。

##profile工具 可以很方便地观察对象的创建和销毁,帮助检查内存泄露问题。

##FlexUnit FlexUnit - Flex单元测试框架

##其他 1、flex生成出来的文件都是很大,请问你用什么办法进行缩小呢? (1)RSL (2)Module (3)外部加载资源

2、做一个flex项目,你认为成功的要素在哪呢? (1)数据和需求等传统软件项目的成功要素 (2)模块化开发,MVC框架 (3)swf文件减肥,运行效率,内存泄露问题,前台优化 (4)开源组件的使用

3、flex 前端的性能优化 (1)、避免容器的多级嵌套,减少相对尺寸、相对定位的使用。 (2)、尽量使用轻量级的容器 (3)、避免使用大体积的组件,比如DataGrid、AdvancedDataGrid (4)、处理数据时多用分页的方式 (5)、少使用setStyle (6)、使用延迟实例化加载子组件

4.Embed绑定图片有什么缺点? 答:直接编译到swf文件中,造成其体积过大。而且由于嵌入代码中,维护不便。

5、flex里调用JS措施? 答:直接在AS中利用ExternalInterface.call()来调用JS措施。如: import flash.external.ExternalInterface ; ExternalInterface.call(“JSFunction”); ExternalInterface.call(“JSFunctionWithParameters”,”myParameter”); var result:String=ExternalInterface.call(“JSFunctionWithReturn”); 6、用JavaScript调用ActionScript函数 答:利用ExternalInterface.addCallback在JavaScript里设置对Flex的回调措施并且在JavaScript里调用ActionScript措施。 AS: ExternalInterface.addCallback(“function1”,callback1); privatefunctioncallback1():void { Alert.show(“callback1executed”); } JS: container[swf].function1(); 6、FileReference browse(typeFilter:Array = null):Boolean//揭示一个文件博览对话框,让用户抉择要上载的文件。 cancel():void//废止正在对该 FileReference 对象厉行的任何上载或下载垄断。 download(request:URLRequest, defaultFileName:String = null):void//敞开对话框,以批准用户从长途服务器下载文件. upload(request:URLRequest, uploadDataFieldName:String = “Filedata”, testUpload:Boolean = false):void//开始将用户抉择的文件上载到长途服务器。

7、flash与flex是如何调停开发的? 答:这个问题能够这么来会意,万一是确乎必需用到FLEX SDK的利用,那我们就能够发生一个flex工程,翔实必需flash做UI的时候,输出成swc作为flex的skin,万一说并无须要flex sdk,只是为了编码得体而抉择flex的话,那我们凡是发生一个as工程,让flex作为flash的编码器。

8、请说下事件里的currentTarget 和 target的区别? 答:在事件流的过程中,目标阶段确定的目标对象由Event中的target属性来记录, 冒泡阶段移动的游标则由currentTarget来记录。事件对象冒泡过程中每往上移动一级,就会克隆出一个仅与前副本currentTarget不同的新副本。

9、warning: unable to bind to property ” on class ‘Object’ (class is not an IEventDispatcher) 在使用ItemRender时,经常会出现这种警告? 答:ArrayCollection的子元素是无法作为数据源绑定的。可以声明中间变量,在override set data时将ArrayCollection的子元素传入, 然后再将中间变量作为新的绑定源即可。

10、常用的几个切换数据的组件比如: TabNavigator等都有属性 creationPolicy 你知道这种策略的使用方式是什么嘛?以及优,缺点呢? 答:延迟实例化。优点是可以更快地加载组件,缺点是首次访问其他组件时,由于需要重新加载此组件,可能会有一定的延迟。

11、请试写一个自定义的验证组件 答:

package myCompenent
    {
        import mx.validators.Validator;//引用Validator类
        import mx.validators.ValidationResult;//引用ValidationResult类
        public class myValidators extends Validator
        {
            public function myValidators()//构造函数
            {
                super();
            }
            private var results:Array;//定义一个数组,用以存储错误
            //重写验证函数
            override protected function doValidation(value:Object):Array
            {
                var s:String = value as String;
                results = [];//清空数组
                results = super.doValidation(value);//先用继承类中的doValida tion方法验证
                if (results.length &gt; 0)//如果验证时有错,返回错误信息
                    return results;
                if(s.length&gt;6)//自定义验证,字符长度不超过6
                {
                    //记录出错信息
                    results.push(new ValidationResult(true,”text”,”StringTooLong”, “字符长度超过6了”));
                }
                return results;
            }
        }
    } 

在flex中监听鼠标右键事件,提示 TypeError Error 2007 参数type不能为空。

2013-03-11 Flash

在flex中监听鼠标右键事件 ,报错,提示 缺少参数、

TypeError: Error 2007: 参数 type 不能为空。

at flash.events::EventDispatcher/addEventListener()
at com.waylau.eagleos.components::DesktopExplorer/service_resultHandler()[D:\workspaceFB47\com.waylau.eagleos_0.9.5\src\com\waylau\eagleos\components\DesktopExplorer.mxml:59]
at com.waylau.eagleos.components::DesktopExplorer/__service_result()[D:\workspaceFB47\com.waylau.eagleos_0.9.5\src\com\waylau\eagleos\components\DesktopExplorer.mxml:214]
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at HTTPOperation/http://www.adobe.com/2006/flex/mx/internal::dispatchRpcEvent()[E:\dev\4.y\frameworks\projects\rpc\src\mx\rpc\http\HTTPService.as:993]
at mx.rpc::AbstractInvoker/http://www.adobe.com/2006/flex/mx/internal::resultHandler()[E:\dev\4.y\frameworks\projects\rpc\src\mx\rpc\AbstractInvoker.as:318]
at mx.rpc::Responder/result()[E:\dev\4.y\frameworks\projects\rpc\src\mx\rpc\Responder.as:56]
at mx.rpc::AsyncRequest/acknowledge()[E:\dev\4.y\frameworks\projects\rpc\src\mx\rpc\AsyncRequest.as:84]
at DirectHTTPMessageResponder/completeHandler()[E:\dev\4.y\frameworks\projects\rpc\src\mx\messaging\channels\DirectHTTPChannel.as:451]
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.net::URLLoader/onComplete()

据悉,flash player 11.2版本以后支持鼠标右键,

所以开发的项目中运行时版本要相应设置,增加参数 -swf-version=15 以支持右键 ,即可


Flex/AS3/flash player支持屏蔽右键菜单,自定义菜单,并设置相应的菜单事件(示例,图解)

2013-03-04 Flash Flex

Flex/AS3/flash player支持屏蔽右键菜单,自定义菜单,并设置相应的菜单事件(示例,图解)

播放器 版本 11.2以后支持右键菜单屏蔽及自定义菜单 1.更新播放器 ,11.2 以上版本

http://download.macromedia.com/get/flashplayer/updaters/11/playerglobal11_3.swc
http://download.macromedia.com/get/flashplayer/updaters/11/playerglobal11_4.swc
http://download.macromedia.com/get/flashplayer/updaters/11/playerglobal11_2.swc
http://download.macromedia.com/get/flashplayer/updaters/11/playerglobal11_5.swc

2.编译器参数设置-swf-version=15(见图)

  1. 自定义 菜单,并设置相应的菜单事件 (Flex代码)
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
			   xmlns:s="library://ns.adobe.com/flex/spark"
			   xmlns:mx="library://ns.adobe.com/flex/mx"
			   xmlns:twaver="http://www.servasoftware.com/2009/twaver/flex"
			   applicationComplete="init()">
	<fx:Script>
		<![CDATA[

			import mx.controls.Button;
			import mx.controls.Menu;
			import mx.events.MenuEvent;
			import mx.controls.Alert;

			private var menu:Menu = null;
			private var bt:Button = new Button();

			private function init():void {
				bt.label = "走你~";
				network.addElement(bt);
				network.addEventListener(MouseEvent.RIGHT_CLICK,handleRighClick);//监听右键
			}
			private function handleRighClick(e:MouseEvent):void {

				if(menu != null){
					menu.hide();
				}
				menu = Menu.createMenu(network, myMenuData, false);//myMenuData菜单数据源
				menu.labelField = "@label";//右键菜单的文字

				var point:Point = network.globalToLocal(new Point(e.stageX, e.stageY));
				menu.show(point.x, point.y);
				menu.addEventListener(MenuEvent.ITEM_CLICK,menuItemClickHandler);  //菜单事件
			}

			private function menuItemClickHandler(evt:MenuEvent):void{
				Alert.show(evt.item.@eventName)  //将事件名显示出来
			}
		]]>
	</fx:Script>
	<fx:Declarations>
		<fx:XML id="myMenuData">
			<root label="MenuItem 1" >
				<menuitem label="new" eventName="new" />
				<menuitem label="refreash" eventName="refreash" />
				<menuitem label="remove" eventName="remove" />
			</root>

		</fx:XML>
	</fx:Declarations>
	<s:Group id="network" width="100%" height="100%"  />
</s:Application>


可行性分析与需求分析

2013-02-27 Management Design

一、概念

可行性分析——可干否 需求分析——要干啥(避免需求蔓延) 二、可行性分析

柳传志“三不干”:没钱赚的事我们不干;有钱赚但投不起钱的事不干;有钱赚也投得起钱但没有可靠的人选,这样的事也不干。 可行性分析要素:经济、技术、社会环境、人 (1) 经济:成本——收益分析、短期——长远利益分析

(2) 技术:技术熟悉度、成熟度、可靠性、稳定性、技术成本、学习曲线

(3) 社会环境:市场、法律、道德

(4) 人——“人物,人才,人手,人渣。”最好的分工是让“人物”当领导,“人才”做第一线的开发人员,“人手”做行政人员,“人渣”负责行贿。

可行性分析报告(附录1) 三、需求分析

难点:客户说不清、需求老变更、理解有偏差 过程: 3.方式:

(1) 研究用户

(2) 调查问卷

(3) 原型完善

(4) 用户陈述

4.需求规格说明书(附录2)

附录1(可行性分析报告)

1.引言

1.1 编写目的

阐明编写可行性研究报告的目的,描述报告基本组成要素,指出读者对象。

1.2 项目背景

列出拟开发软件系统的名称,项目委托者、开发者和预期用户,说明该软件系统与其他系

统之间的关系等。

1.3 定义

列出报告中所使用的专门术语的定义和缩写词的原意。

1.4 参考资料

列出本文档需要引用的参考资料的来源。包括:已被批准的项目任务书、合同或上级机关

批文,与项目有关的已经公开发表的论文、著作,需要采用的标准或规范。

2.可行性研究的前提

2.1 基本要求

列出项目的各项基本要求,涉及功能、性能、数据输入、数据输出、数据处理流程、安全

保密要求、与其他系统的关系、完成期限等。

2.2 基本目标

涉及人力与设备费用的减少,工作环境的改善,工作效率的提高,处理速度、控制精度或

生产能力的提高,信息管理服务的改进,自动决策功能的改进等。

2.3 条件、假定和限制

涉及拟开发系统运行寿命的最小值,项目经费来源与限制,政策和法规方面的限制,硬件、

软件、开发环境和运行环境方面的条件与限制,可以利用的相关资源,拟开发系统要求投入使

用的最迟时间等。

3.对现有系统的分析

3.1 系统模型

可使用系统方框图、系统流程图说明现有系统的基本构造与基本处理流程。

3.2 工作负荷

列出现有系统所承担的工作与工作量。

3.3 费用支出

涉及现有系统运行过程中的人力、设备、空间、支持性服务和材料等各项支出。

3.4 局限性

指出现有系统存在的问题,并说明开发新系统或改造现有系统的必要性。

B.2 项目计划说明书209

4.对拟开发系统的分析

4.1 拟开发系统的体系结构

可使用系统方框图对拟开发系统的体系结构进行概要描述。

4.2 拟开发系统的工作模型

可使用系统流程图说明拟开发系统的基本处理流程。

4.3 拟开发系统的优越性

将拟开发系统与现有系统进行对比,并在诸如提高处理能力、减轻工作负荷、增强系统灵

活性和保证数据安全等方面,说明拟开发系统所具有的优越性。

4.4 拟开发系统可能带来的影响

涉及拟开发系统将对硬件设备、软件配置和用户操作等方面带来的影响。

5.对拟开发系统的可行性评价

5.1 技术可行性评价

说明拟开发系统在技术方面具备的可行性,例如,在当前技术允许的条件下,该系统的功

能目标能否达到;在规定的时间期限内,该系统的开发能否按期完工。

5.2 经济可行性评价

说明拟开发系统所需的开发费用和可以预期的经济收益,并由此进行成本效益分析。

5.3 社会因素的可行性评价

从法律法规、用户操作规程等方面进行可行性评价,例如项目合同中责任是否明确,拟开

发系统是否存在著作侵权,是否侵犯了国家、集体或他人的利益,拟开发系统是否充分考虑到


Cairngorm框架项目开发流程

2013-02-26 Cairngorm Flex

##Cairngorm框架的流程,由前往后 ,如下:

###Services.mxml

###VO ###model ###注册model

###event // 常量值简短,有利于编译效率 ###DL ###command

###AppControl

###view


软件工程概述

2013-02-20 Management

一、软件工程概述

软件工程是一门研究用工程化方法构建和维护有效的、实用的和高质量的软件的学科。

最主要的目的是为了解决软件危机。

 

二、软件危机

表现:

1.软件开发成本、进度的估计很不准确

软件开发机构制定的项目计划跟实际情况有很大差距,使得开发经费一再突破。由于对工

作量和开发难度估计不足,进度计划无法按时完成,开发时间一再拖延,这种现象严重降低了软件开发机构的信誉。

2.软件产品常常与用户的要求不一致

在开发过程中,软件开发人员和用户之间缺乏信息交流。开发人员常常是在对用户要求只

有模糊了解的情况下就仓促上阵,匆忙着手编写程序。由于这些问题的存在,导致开发出来的软件不能满足用户的实际应用需要。

3.软件产品质量可靠性差

软件开发过程中,没有建立起确实有效的质量保证体系。一些软件项目为了赶进度或降低

软件开发成本,甚至不惜降低软件质量标准、偷工减料。

4.软件文档不完整、不一致

计算机软件不仅仅是程序,在软件开发过程中还应该产生出一系列的文档资料。实际上,

软件开发非常依赖这些文档资料。在软件开发过程中,软件开发机构的管理人员需要使用这些文档资料来管理软件项目;技术人员则需要利用文档资料进行信息交流;用户也需要通过这些文档资料来认识软件,对软件进行验收,熟悉软件的安装、操作等。但是,由于软件项目管理工作的欠缺,软件文档往往不完整,对软件的描述经常不一致,很难通过文档去跟踪软件开发过程中软件产品规格的变更。

5.软件产品可维护性差

软件中的错误非常难改正,软件很难适应新的硬件环境,很难根据用户的需要在原有软件

中增加一些新的功能。这样的软件是不便于重用的,以前开发的软件,一旦过时就不得不完全丢弃。

6.软件生产率低

软件生产率跟不上硬件的发展速度,不能适应计算机应用的迅速普及,以致现代计算机硬

件提供的巨大潜力不能被充分利用。

 

三、危机产生的原因

看点历史:

观察软件的发展,可以发现软件生产有三个发展时代,即程序设计时代、程序系统时代和

软件工程时代。

1.程序设计时代(20 世纪50 年代)

这个时期的程序大多是自用,程序的编写者往往也就是使用者,软件还没有形成为产品。

由于早期程序大多是为某个具体应用而专门编写的,程序任务单一,因此,对程序的设计也就仅仅体现在单个程序的算法上。早期程序还往往只能在某台专门的计算机上工作,很难将程序由一台设备移植到另一台设备。

 

2.程序系统时代(20 世纪60 年代)

这个时期的软件开发更多地依赖于个人创作。由于软件开发的主要内容仍然是程序编写,

软件开发的核心问题仍是技术问题;于是,用户的意图被忽视了,除了程序之外的其他文档、

技术标准、软件在今后运行过程中的维护等问题,也往往被忽视了。

软件已经开始成为产品,但软件的生产方式则是跟产品并不适宜的作坊创作方式。于是,

随着软件规模的不断扩大,软件危机现象在这个时期最终爆发出来。

 

3.软件工程时代(20 世纪70 年代起)

1968 年在联邦德国召开的计算机国际会议上,专门针对软件危机问题进行了讨论,在这次

会议上正式提出并使用了“软件工程”术语。于是,软件工程作为一门新兴的工程学科诞生了。

在软件开发上,自20 世纪70 年代以来的30 年里,结构化的工程方法获得了广泛应用,

并已成为了一种成熟的软件工程方法学;而自20 世纪90 年代起,基于面向对象的工程方法,也已被应用于软件开发之中。应该说,采用工程的原理、技术和方法实施软件产品开发,以适应软件产业化发展的需要,成为了这个时期诸多软件企业的追求目标。

 

 

真正的原因:

1.软件的不可见特性

软件不同于硬件,它是计算机系统中的逻辑部件,缺乏“可见性”。硬件错误往往可以通

过它的物理现象直接反映出来,例如,出现不正常的发热、噪音现象等;但软件错误没有这些直观表现,例如,软件中存在的程序行错误,就必须等到这行程序执行时才有可能被发现。因此,软件错误比起硬件错误来更难发现。软件的不可见特性也使得对软件项目的量化管理更难实施,对软件质量的量化评价更难操作。

2.软件系统规模庞大

软件成为产品以后已不同于早期程序,随着它的功能的增多,其规模、复杂程度越来越大。

例如,1968 年美国航空公司订票系统达到30 万条指令;IBM360OS 第16 版达到100 万条指令;1973 年美国阿波罗计划达到1 000 万条指令。这些庞大规模的软件系统,其复杂程度已超过了人所能接受的程度;但是,面对不断复杂的软件系统,其开发手段却仍然需要依靠开发人员的个人创造与手工操作。

3.软件生产工程化管理程度低

软件生产的工程化管理是软件作为产品所必须的,这意味着软件也需要像硬件一样,在软

件分析、设计完成之后,才能考虑软件的实现。应该说,工程化管理能够降低解决问题的代价。但是,许多软件的开发则往往是在分析、设计没有完成的情况下,就已经进入编码实现阶段。由于前期准备工作不充分,致使软件项目管理纷乱,严重影响软件项目成本、开发进度。

4.对用户需求关心程度不够

软件开发机构不熟悉用户业务领域。软件技术人员所关注的仅仅是计算机技术,它们不太

愿意和用户沟通,轻视对用户的需求调查,也缺乏有效的用户调查策略、手段。由于这些问题的存在,使得用户的需求意愿不能充分反映,或被错误理解。

实际上,软件是为用户开发的,只有用户才能真正了解他们自己的需要。由于没有对用户

做大量深入细致的调查研究,以致软件需求规格定义不准确,并最终使得完成后的软件不能适应用户的应用需要。

5.对软件维护重视程度不够

软件开发缺乏统一的规范。在软件产品开发过程中,开发者很少考虑到这个软件今后还需

要提供维护。但是,软件的使用周期漫长,软件错误具有隐蔽性,许多年之后软件仍可能需要改错。另外,软件的工作环境也可能会在几年后发生改变;用户也可能在软件运行几年以后,要求对它增加新的功能。这些都是属于软件维护问题。实际上,软件的可维护性是衡量软件质量的一项重要指标,软件可维护性程度高,软件就便于修正、改版和升级,由此可以使软件具有更长的使用寿命。

6.软件开发工具自动化程度低

尽管软件开发工具比30 年前已经有了很大的进步,但直到今天,软件开发仍然离不开工

程人员的个人创造与手工操作,软件生产仍不可能像硬件设备的生产那样,达到高度的自

动化。

 

四、探讨如何解决危机

  1. 软件工程的主要环节有:人员管理、项目管理、可行性与需求分析、系统设计、程序设计、测试、维护

 

 

  1. 常见的软件工程模型有:线性模型(瀑布模型),渐增式模型,螺旋模型,快速原型模型,增量模型,喷泉模型等

最早出现的软件工程模型是线性模型(又称瀑布模型)。

瀑布模型核心思想是按工序将问题化简,将功能的实现与设计分开,便于分工协作,即采用瀑布模型用结构化的分析与设计方法将逻辑实现与物理实现分开。将软件生命周期划分为制定计划、需求分析、软件设计、程序编写、软件测试和运行维护等六个基本活动,并且规定了它们自上而下、相互衔接的固定次序,如同瀑布流水,逐级下落。

002

优点

1)为项目提供了按阶段划分的检查点。

2)当前一阶段完成后,您只需要去关注后续阶段。

缺点

1)在项目各个阶段之间极少有反馈。

2)只有在项目生命周期的后期才能看到结果。

3)通过过多的强制完成日期和里程碑来跟踪各个项目阶段。

4)瀑布模型的突出缺点是不适应用户需求的变化.

 

线性模型太理想化,太单纯,已不再适合现代的软件开发模式,几乎被业界抛弃。但是复杂的“非线性”问题时,总是千方百计地将其分解或转化为一系列简单的线性问题。

 

 

螺旋模型:

基本做法是在“瀑布模型”的每一个开发阶段前引入一个非常严格的风险识别、风险分析和风险控制,它把软件项目分解成一个个小项目。每个小项目都标识一个或多个主要风险,直到所有的主要风险因素都被确定。

003

优点

1)设计上的灵活性,可以在项目的各个阶段进行变更。

2)以小的分段来构建大型系统,使成本计算变得简单容易。

3)客户始终参与每个阶段的开发,保证了项目不偏离正确方向以及项目的可控性。

4)随着项目推进,客户始终掌握项目的最新信息 , 从而他或她能够和管理层有效地交互。

5)客户认可这种公司内部的开发方式带来的良好的沟通和高质量的产品。

缺点

很难让用户确信这种演化方法的结果是可以控制的。建设周期长,而软件技术发展比较快,所以经常出现软件开发完毕后,和当前的技术水平有了较大的差距,无法满足当前用户需求。

螺旋模型的项目适用:

对于新近开发,需求不明确的情况下,适合用螺旋模型进行开发,便于风险控制和需求变更!

 

快速原型模型