基于人脸识别的校园签到系统的设计与实现_第1页
基于人脸识别的校园签到系统的设计与实现_第2页
基于人脸识别的校园签到系统的设计与实现_第3页
基于人脸识别的校园签到系统的设计与实现_第4页
基于人脸识别的校园签到系统的设计与实现_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于人脸识别的校园签到系统[19]。相关代码如下:face_cascade.detectMultiScale(frame_gray,faces,1.1,2,0|CV_HAAR_SCALE_IMAGE,Size(30,30));4)显示目标调用circle函数将刚才得到的faces圆形框都显示出来,相关代码:circle(img,center,radius,color,3,8,0);系统功能细节处理导出表格导出表格功能在系统多次用到,因此单独提出作为模块引擎调用。Qt在windows商业版本中提供了ActiveQt这个framework,使用该组件我们可以在Qt中使用ActiveX控件,并且也可以开发基于Qt的ActiveX控件。本系统使用的表格引擎将功能完全封装,并做了格式优化,保证导出的表格有合适的高度、宽度等,并且调用模块较为简单。调用导出表格功能相关代码://导表--签到详细voidSignDetail::on_pushButtonOutXls_clicked(){QStringfileName=QFileDialog::getSaveFileName(NULL,tr("SaveFile"),".","ExcelFile(*.xls)");fileName.replace("/","\\");ExcelEngineexcel(fileName);excel.Open();excel.SaveDataFrTable(ui->tableView);//导出报表excel.Close();}新建对象后,只需输入文件路径,打开引擎,输入当前表格参数(tableview),关闭引擎,即可完成导表功能。表格引擎工作原理:ExcelEngine::ExcelEngine(QStringxlsFile){pExcel=NULL;pWorkbooks=NULL;pWorkbook=NULL;pWorksheet=NULL;sXlsFile=xlsFile;nRowCount=0;nColumnCount=0;nStartRow=0;nStartColumn=0;bIsOpen=false;bIsValid=false;bIsANewFile=false;bIsSaveAlready=false;}在构造函数初始化引擎相关参数后,使用Open打开操作系统的Excel控件,添加工作簿,并获取初始的表格行列等相关参数,该函数调用Save将内存中的二进制数据保存至文件中。相关代码:if(NULL==pExcel){pExcel=newQAxObject("Excel.Application");if(pExcel){bIsValid=true;}else{bIsValid=false;bIsOpen=false;returnbIsOpen;}pExcel->dynamicCall("SetVisible(bool)",bIsVisible);}if(!bIsANewFile){pWorkbooks=pExcel->querySubObject("WorkBooks");//获取工作簿pWorkbook=pWorkbooks->querySubObject("Open(QString,QVariant)",sXlsFile,QVariant(0));//打开xls对应的工作簿}else{pWorkbooks=pExcel->querySubObject("WorkBooks");//获取工作簿pWorkbooks->dynamicCall("Add");//添加一个新的工作薄pWorkbook=pExcel->querySubObject("ActiveWorkBook");//新建一个xls}pWorksheet=pWorkbook->querySubObject("WorkSheets(int)",nCurrSheet);//打开第一个sheet//至此已打开,开始获取相应属性QAxObject*usedrange=pWorksheet->querySubObject("UsedRange");//获取该sheet的使用范围对象QAxObject*rows=usedrange->querySubObject("Rows");QAxObject*columns=usedrange->querySubObject("Columns");//因为excel可以从任意行列填数据而不一定是从0,0开始,因此要获取首行列下标nStartRow=usedrange->property("Row").toInt();//第一行的起始位置nStartColumn=usedrange->property("Column").toInt();//第一列的起始位置nRowCount=rows->property("Count").toInt();//获取行数nColumnCount=columns->property("Count").toInt();//获取列数bIsOpen=true;returnbIsOpen;}通过SaveDataFrTable读取输入的tableview中的表格数据,逐个写入,相关代码:inttableR=tableView->model()->rowCount();inttableC=tableView->model()->columnCount();//获取表头写做第一行for(inti=0;i<tableC;i++){if(tableView->model()->headerData(i,Qt::Horizontal,Qt::DisplayRole)!=NULL){this->SetCellData(1,i+1,tableView->model()->headerData(i,Qt::Horizontal,Qt::DisplayRole).toString());pWorksheet->querySubObject("Cells(int,int)",1,i+1)->setProperty("HorizontalAlignment",-4108);//表头居中显示}}intColWidth[20]={0};//写数据for(inti=0;i<tableR;i++){for(intj=0;j<tableC;j++){if(tableView->model()->index(i,j).data()!=NULL){QModelIndexindex=tableView->model()->index(i,j,QModelIndex());if(isChar(index)&&(0==ColWidth[j]||index.data().toString().length()>ColWidth[j])&&index.data().toString().length()>4){ColWidth[j]=index.data().toString().length();this->SetCellData(i+2,j+1,index.data().toString(),ColWidth[j]);}elseif(!isChar(index)&&(0==ColWidth[j]||2*index.data().toString().length()>ColWidth[j])&&index.data().toString().length()>4){ColWidth[j]=2*index.data().toString().length();this->SetCellData(i+2,j+1,index.data().toString(),ColWidth[j]);}else{//modelthis->SetCellData(i+2,j+1,index.data().toString());}}}}//保存Save();returntrue;}最后使用Close关闭表格引擎正则表达式该系统中大多数编辑框输入需要有格式要求,该功能使用正则表达式实现,如验证密码合法性功能。相关代码:QRegExpre("^[A-Za-z0-9]+$");//只能输入字母和数字QRegExpValidator*pReva=newQRegExpValidator(re,this);ui->lineEditPwd->setValidator(pReva);ui->lineEditConfirPwd->setValidator(pReva);用户权限处理该系统使用全局变量存储用户名和权限信息,QStringmain_username;QStringidentify;在初始化主窗体时检查用户权限,并对相关功能进行限制。if(identify!=QString::fromLocal8Bit("系统管理员")){ui->pushButtonAddgst->setEnabled(false);ui->pushButtonDelgst->setEnabled(false);ui->groupBoxSearchgst->setEnabled(false);ui->pushButtonResetPwd->setEnabled(false);}数据库操作失败处理数据库操作失败相关信息同样使用全局变量存储,在数据库操作失败时,将信息存储于全局变量中,弹窗提示时即可看到错误信息,方便用户进行反馈和管理员对系统数据库错误进行处理。//数据库操作boolflag=query.exec(sSQL);if(query.lastError().isValid()){Error="\nError:"+QString::number(query.lastError().number());Error+="\n"+query.lastError().text();}//弹窗提醒boolflag=stu->delstu(sid);if(flag){loadstu();QMessageBoxmessage(QMessageBox::NoIcon,tr("Notify"),tr("Del_OK"));message.exec();}else{QMessageBoxmessage(QMessageBox::NoIcon,tr("Notify"),tr("Del_Fail\n")+Error);message.exec();}Qt国际化由于MSVC编译器对中文的支持不是很好,同时为了方便对系统进行国际化翻译,本系统使用了Qt国际化。将需要翻译的地方使用tr()函数处理,在.pro文件中添加TRANSLATIONS+=language.ts使用IDE生成相关翻译文件后,使用lingust进行翻译,生成翻译好的二进制文件,在MAIN函数中载入翻译好的文件:QApplicationa(argc,argv);a.connect(&a,SIGNAL(lastWindowClosed()),&a,SLOT(quit()));QTranslatorqtTranslator;qtTranslator.load("language.qm");a.installTranslator(&qtTranslator);本章小结本章详细介绍了在签到系统实施过程中各个功能模块较为重要的功能实现的具体方法、思路和相关代码,特别是人脸识别模块,同时也介绍了一些系统的细节功能的实现和处理方法,使整个系统更加符合用户需求及管理员的维护。

系统配置与说明系统配置要求1)操作系统要求:WindowsXP/Vista/7/8/8.1(推荐7及更高版本)2)内存要求:2GB或以上[推荐]3)磁盘空间要求:不小于80GB4)开发工具:QtCreatorWindows-x86-msvc2013_64-5.4.05)识别算法:OpenCV-2.4.116)数据库要求:mysql,编码格式为UTF-8,帐号为root,密码为mysql.系统所使用的库为Qt5核心的动态链接文件,部署系统时需要将相关动态链接文件和数据库驱动拷贝至相应文件夹下。使用说明与注意事项该系统使用时需写入初始数据,如基本的学院专业信息等,完成后将学生信息导入系统,上传人脸初始信息,即可进行人脸识别签到。由于人脸的外形很不稳定,比如人可以通过脸部的变化产生很多表情,而且在不同观察角度,人脸的二维图像也相差很大,同时,人脸识别还受光照条件(例如白天和夜晚,室内和室外等)、遮盖物(例如口罩、墨镜、头发、胡须等)、年龄等多方面因素的影响。该系统的视觉识别引擎暂时未解决此类问题,因此不同环境下识别效果会急剧下降,无法满足实际系统的需要。

总结本系统实现了人脸识别的功能,包括对摄像头图像的采集、人脸图像采集及检测、人脸图像预处理、人脸图像特征提取以及匹配与识别,以及对学生信息、签到信息、用户信息的管理与统计。系统不足之处在于对环境的适应性较差,包括光线和人本身的表情及遮盖物等。这是由于本身人脸是立体的,在不同光照环境下造成的阴影影响了最终的图像效果,同时人脸本身的遮盖物如口罩、眼镜、头发、胡须等也会遮盖一部分五官,会造成人脸特征的大幅度波动,最终对识别效果造成极大影响,如果有需要可以设计使用红外敏感摄像头采集图像,并尽量减少面部遮盖物,提高识别效果。通过此次课题的研究,让我更加深入的了解了计算机视觉识别的一些知识,对于计算机视觉识别和模式识别在日常生活中的应用有了更深层次的了解。在研究时也发现了自身对于视觉识别的不理解之处,并查看相关书籍和国外一些网站、论坛等解决了不懂的问题。结合实际研究中的实践,和本次的毕业论文撰写,我了解了很多也学到了很多相关知识和经验。同时,对以前所学的专业知识,有了进一步的加深和巩固。

致谢通过做毕业设计这段时间的研究和学习,我学到了很多以前不知道的知识,并且在这个过程中培养了一种做事一丝不苟的态度和不骄不躁的耐心,为以后的工作打下了坚实的基础。在此我要向我的论文的指导老师表示衷心的感谢,可以让我通过这次机会系统学习了如何实现一个管理系统和计算机视觉识别的知识,并能具体结合实践生活完成人脸识别签到系统,并在系统实施方面给了我很多帮助和指点,他对工作认真负责和严谨的教学作风将是我学习的榜样。

参考文献艾英山,张德贤.人脸识别方法的综述与展望[J].计算机与数字工程,2005,10:24-27.杨斌.人脸识别技术探究[J].硅谷,2011,21:112+88.刘西富.基于视频监控的人脸识别技术[D].重庆大学,2008.刘明锋.基于Gabor像素模式纹理特征的人脸识别[D].大连理工大学,2008阮揆.人脸识别技术的研究与应用[D].国防科学技术大学,2006陈志恒,姜明新.基于openCV的人脸检测系统的设计[J].电子设计工程,2012,10:182-185.PaulDuBois(美).MySQL技术内幕[M].杨晓云,王建桥,杨涛.北京:人民邮电出版社,2012.JasminBlanchette(加拿大).C++GUIQt4[M].北京:电子工业出版社,2008.陆文周.Qt5开发及实例[M].北京:电子工业出版社,2014.安晓辉.QtQuick核心编程[M].北京:电子工业出版社,2015.霍亚飞,吴迪,白建平,董世明.QtCreator快速入门[M].北京:北京航空航天大学出版社,2012.霍亚飞.Qt及QtQuick开发实战精解[M].北京:北京航空航天大学出版社,2012.尼克松(MarkS.Nixon),阿瓜多(AlbertoS.Aguado).李实英(译者),杨高波(译者).特征提取与图像处理[M].北京:电子工业出版社,2010.帕科尔(J.R.Parker).图像处理与计算机视觉算法及应用[M].景丽.北京:清华大学出版社,2012.RobertLaganiere.OpenCV2计算机视觉编程手册[M].张静.北京:科学出版社,2013.布拉德斯基(Bradski.G.),克勒(Kaehler.A.).学习OpenCV(中文版)[M].于仕琪,刘瑞祯.北京:清华大学出版社,2009.Daniel(巴西).深入理解OpenCV:实用计算机视觉项目解析[M].北京:机械工业出版社,2014.于士琪,刘瑞祯.OpenCV教程:基础篇[M].北京:北京航空航天大学出版社,2007.闫日亮,张会林,黄金钰.基于信息熵和Harris算法的人脸图像质量评价[J].计算机安全,2011,09:11-12+16.

毕业设计(论文)任务书设计(论文)题目基于人脸识别的校园签到系统专业学生姓名指导教师姓名、职称下发日期(任务起止日期:年月日至年月日)设计(论文)的主要内容与要求及其主要技术指标:基于人脸识别的校园签到系统是用摄像机或摄像头采集含有人脸的图像或视频流,并自动在图像中检测和跟踪人脸,进而对检测到的人脸进行脸部识别,与数据库中存储的人脸信息进行对比,以达到签到目的的一套人脸识别与签到信息管理系统。该系统基于Qt+MySQL+OpenCV计算机视觉库,使用服务器+客户端+摄像头等设备,搭建一个无纸化的签到系统。该系统包含的功能模块分别有:用户登录、用户信息管理、学生信息管理、签到信息管理、人脸识别算法模块。通过这些模块使签到从签到事件发布、学生签到、签到信息管理和考勤情况统计全部在计算机上完成,并能生成表格供管理人员查阅、参考。进度安排序号毕业设计(论文)工作进度日期(起止周数)%123456主要参考文献:C.GUI.Qt.4编程(第二版)(加)布兰切特,(英)萨默菲尔德QT4.1参考手册精通Qt4编程(第2版)MySQL从入门到精通学习OpenCV(中文版)[美]GaryBradski等系(教研室)意见:签字:年月日学院意见:签字:年月日注:1.此任务书由指导教师填写。2.此任务书最迟必须在第七学期20周之前下达给学生。3.此表由各系(部)收集存档,以备教务处检查。毕业论文(设计)开题报告书题目基于人脸识别的校园签到系统的设计与实现姓名学号专业指导教师姓名院(部)课题性质学号专业课题来源题目基于人脸识别的校园签到系统的设计与实现选题的目的、意义:目前,在学校的学生签到还停留在纸质签到阶段,学生排队签到要浪费一定的时间,而且,签到经常发生错误,导致经常性发生代签、记录时间不准,数据混乱;同时,学校统计签到信息需要花费大量的时间和人力资源。如果使用该系统,直接使用摄像头检测,就可以实现自动登记,保证数据可靠性和安全性,同时实现无纸化办公,也能够对签到的数据进行统计,极大简化了办公人员的工作量。本课题的技术核心在于人脸识别模块,该技术的研究开始于上世纪七十年代,当时的研究主要是基于人脸外部轮廓的方法。到现在为止,人脸识别主要经历了三个阶段的发展,第一阶段以Allen和Parke为代表,主要研究人脸识别所需要的面部特征,研究者用计算机实现了较高质量的人脸灰度图模型。第二阶段是人机交互式识别阶段,代表性工作有Harmon和Lesk用几何特征参数来表示人脸正面图像。他们采用多维特征矢量表示人脸面部特征,并设计了基于这一特征表示法的识别系统。Kayak、Kobayashi则采用了统计识别方法,用欧氏距离来表征人脸特征。第三阶段是真正的机器自动识别阶段。国外进行人脸识别研究的著名机构有美国麻省理工学院媒体实验室及人工智能实验室、南加州大学(USC)、CMU卡内基-梅隆机器人研究及交互系统实验室、马里兰大学(UMD)等,同时也有一批企业提供了比较成熟的商用系统或解决方案,比如Identix(前身为Visionics)基于Rockfeller大学的LFA算法开发的FaceIt;Viisage开发的Viisage,基于MIT的特征脸技术,后来开发了ICA技术,2004年1月开始又融合了ZN公司的弹性图匹配技术;Cognitec的FaceVACS-SDK,采用多阶高斯导数滤波特征,并对这些特征进行判别分析用于最终的匹配识别;NevenVision的Eyematic,基本算法是基于Gabor特征的人脸识别方法。其前身为Eyematic,2003.7被NevenVision收购,最近NevenVision被Google收购。由于互联网的兴起,目前包括Google、Twitter、Facebook在内的多家互联网企业也开始致力于人脸识别的研究。国内最早研究人脸识别的,当属于中科院计算所与哈工大的某联合面像实验室。该实验室的高文教授,陈熙林教授,山世光教授,直到今天,都一直活跃在人脸识别领域。其次是中科院生物识别研究所的李子青教授。丁晓青教授在OCR(字符识别)领域,可谓国内第一人,从FRVT2006(美国国家标准研究所2006年全球人脸识别供应商系统性能测试)的测试结果来看,丁晓青教授的研究团队是唯一一个完成大规模3D人脸识别性能测试的参赛团队。目前,国内人脸识别产品市场占有率最高的,是汉王科技的门禁和考勤系统。汉王科技也是中科院下属的一个公司,其人脸识别技术,是采用双摄像头,分别捕获到人脸的信息,从而合成3D人脸图片,然后进行特征提取和相应的识别工作。最后一个,是深圳的飞瑞斯,该公司最近也在推广其自主开发的人脸识别系统。于前几位不同的是,它们采用了多光源进行补光的策略,从而有效解决了人脸识别中环境干扰的问题。国外的研究现状没有列举出来,本文研究这个课题的实效性。论文提纲目录初步设计:绪论1.人脸识别签到系统开发的必要性分析1.2人脸识别的开发背景和意义1.3人脸识别签到系统的市场前景2.系统分析2.1功能需求分析2.2系统设计2.2.1系统总设计2.2.2签到信息管理模块2.2.3学生信息管理模块2.2.4用户信息管理模块2.2.5人脸识别算法模块2.3系统流程设计2.4系统用例设计3.数据库需求分析与结构设计3.1数据库E-R模型3.2数据库结构设计4.系统配置与说明4.1系统配置要求4.2使用说明与注意事项5.系统实施5.1登录界面5.2签到主页面5.3签到信息管理5.4学生信息管理5.5用户管理6.主要参考文献本系统操作简单,签到人员来到自己的岗位后可以直接在自己的电脑上完成签到。恰恰弥补了现今市场流通的高配置签到系统的不足,为学校节省了不菲的额外开支;同时也实现了签到的无纸化、规范化、自动化。本设计包含的功能模块分别有:用户登录、用户信息管理、学生信息管理、签到信息管理、人脸识别算法模块。通过这些模块使签到从签到事件发布、学生签到、签到信息管理和考勤情况统计全部在计算机上完成,并能生成表格供管理人员查阅、参考。本课题基于Qt4+MySQL+OpenCV计算机视觉库,使用C/S架构,采用摄像头设备进行图像的采集,来搭建一个无纸化的签到系统。本系统的软件开发环境以及运行环境具体如下: 操作系统:WindowsXP以上版本;开发工具:QT4;开发语言:C++;数据库管理软件:MySQL;运行平台:Windows、Linux等各版本;分辨率:最佳效果1024×768像素进度安排:序号毕业设计(论文)工作进度日期(起止周数)%1选定课题52根据毕业任务书撰写开题报告53阅读相关参考资料进行前期准备工作104系统需求分析及概要分析205设计编码实现各模块的初步功能306系统编码完善各模块的功能107系统调试并撰写毕业设计论文108提交毕业论文、修改、定稿、打印59评阅论文、毕业答辩5三、推荐使用的主要参考文献:《MySQL数据库应用从入门到精通(第2版)》王飞飞(作者),崔洋(作者),贺亚茹(作者)中国铁道出版社《高性能MySQL(第3版)》施瓦茨(BaronSchwartz)(作者),扎伊采夫(PeterZaitsev)(作者),特卡琴科(VadimTkachenko)(作者),宁海元(译者),周振兴(译者),彭立勋(译者),翟卫祥(译者),等(译者)电子工业出版社《MySQL技术内幕》(美)PaulDuBois杨晓云王建桥杨涛译著人民邮电出版社《深入浅出MySQL:数据库开发、优化与管理维护(第2版)》唐汉明(作者),翟振兴(作者),关宝军(作者),王洪权(作者),等(作者)人民邮电出版社《C++GUIQt4》(加拿大)JasminBlanchette等著,电子工业出版社《Qt5开发及实例》陆文周(编者)电子工业出版社《QtQuick核心编程》安晓辉(作者)电子工业出版社《Qt应用编程系列丛书:QtCreator快速入门(第2版)》霍亚飞(作者),吴迪(合著者),白建平(合著者),董世明(合著者)北京航空航天大学出版社《Qt应用编程系列丛书:QtCreator快速入门》霍亚飞(作者)北京航空航天大学出版社《Qt应用编程系列丛书:Qt及QtQuick开发实战精解》霍亚飞(作者)北京航空航天大学出版社《特征提取与图像处理(第2版)(简体中文)》尼克松(MarkS.Nixon)(作者),阿瓜多(AlbertoS.Aguado)(作者),李仁发(注释解说词),李实英(译者),杨高波(译者)电子工业出版社《图像处理与计算机视觉算法及应用(第2版)(简体中文)》帕科尔(J.R.Parker)(作者),景丽(译者)清华大学出版社《OpenCV2计算机视觉编程手册(简体中文)》RobertLaganiere(作者),张静(译者)科学出版社《学习OpenCV(中文版)(简体中文)》布拉德斯基(Bradski.G.)(作者),克勒(Kaehler.A.)(作者),于仕琪(译者),刘瑞祯(译者)清华大学出版社《深入理解OpenCV:实用计算机视觉项目解析》(巴西)Daniel(作者)机械工业出版社《OpenCV教程:基础篇》于士琪(作者),刘瑞祯(作者)北京航空航天大学出版社指导教师意见:签章:年月日五、院(部)审查意见:签章:年月日英文文献翻译文献、资料题目:EvolvingJavaWithoutChanging theLanguage文献、资料来源:InfoQ文献、资料发表日期:院(部):专业:班级:姓名:学号:指导教师:翻译日期:外文文献:EvolvingJavaWithoutChangingtheLanguageIn"TheFeelofJava"JamesGoslingstatedthat:Javaisabluecollarlanguage.It'snotPhDthesismaterialbutalanguageforajob.JavafeelsveryfamiliartomanydifferentprogrammersbecauseIhadaverystrongtendencytopreferthingsthathadbeenusedalotoverthingsthatjustsoundedlikeagoodidea.TheextraordinarysuccessofJavaoffersweighttothenotionthatthiswasasensibleapproach,andifitremainsanimportantgoalforJavatoday,thenitmakessensethatthelanguageshouldcontinuetoevolverelativelyslowly.Inadditiontothis,thefactthatJavaisamature,widelyusedlanguagecausesitsevolutiontobefraughtwithdifficulty.Foronething,eachfeatureaddedtothelanguagecanchangethewayitfeelsinsubtleandoftenunpredictableways,riskingalienatingdeveloperswhohavealreadyadopteditastheirlanguageofchoice.Foranother,afeaturethatmakesperfectsenseonitsownmayinteractwithotherfeaturesofthelanguageinawkwardorunexpectedways.Worse,oncealanguagefeaturehasbeenaddeditisallbutimpossibletoremoveevenifitturnsouttobedetrimentaltothelanguageasawhole.Tojustifyaddinganewfeature,alanguagedesignermustbehighlyconfidentthatitwillbeoflongtermbenefittothelanguageratherthanashorttermorfashionablesolutiontoaproblemthatrapidlybecomesredundant.Tomitigatetheriskalanguagedesignerwilltypicallyexperimentbycreatingaseparatelanguageorbranch,suchasthePizzalanguageusedtoexperimentwithJava'sgenerics,priortotheirimplementation.Theproblemwiththisapproachisthattheaudienceforsuchexperimentsisbothsmallandself-selecting;obviouslytheywillallbeinterestedinlanguagefeatures,andmanymaybeacademicsorresearchers.Anideawhichplayswelltosuchanaudiencemaystillplaybadlywhenitisincorporatedintothemainlanguageandgeneralprogrammersstarttoworkwithit.Togetasenseofthis,considertheclosuresdebatethatbecamesoheatedforJava7.Implementationsforthemainproposals(andsomeothers)havebeenavailableforsometimebutnoconsensushasemerged.InconsequenceSundecidedthatJDK7willnotgetfullclosuressupport.ThecoreargumentcamedowntowhetherJavahadbecomeascomplexasitcouldaffordtobewhengenerics(andinparticularthewildcardsyntax)wereaddedtoJava5;andwhethertheadditionoffullsupportforclosureswasjustifiedwhenJavaalreadyhasamorelimitedformthroughanonymousinnerclasses.Twoimportantusecasesforaddingfullclosuressupportweretosimplifyworkingwiththefork/joinAPIthatisbeingaddedtoJDK7toimprovemulti-coreprogramming,andtohelpwithresourceclean-up.JoshBloch'sARMblockproposal,whichisnowexpectedtobeinJDK7viaProjectCoin,offersanalternativesolutiontothelatterproblem.Dr.CliffClick'sresearchonascalable,non-blockingprogrammingstyleforJavaoffersanalternativeapproachtofork/jointhatmaybemoreappropriateasthenumberofprocessorcoresincreases.Ifthisweretohappen,thentheusesforclosuresinJavamayarguablybetoolimitedtojustifytheirinclusion.Itremainsimportantthoughthataprogramminglanguagecontinuestodevelopatsomelevel.ThisarticlethereforeexaminesthreealternativetechniquesforaddingnewlanguagefeaturestoJavathatdon'trequirechangestothelanguageitself-usingacustomDomainSpecificLanguage,exploitingtheJava6annotationprocessortoaddoptionallanguagefeaturesviaalibrary,andmovingthesyntacticsugarfromthelanguagetotheIDE.Eachoffersthepotentialtoallowawideaudienceofmainstreamdeveloperstoexperimentwiththenewfeaturesoverthemediumterminanon-invasivemanner,andthebestideascanthenfilterdownforinclusioninthecorelanguage.CustomDSLsThemostwidelydiscussedofthethreeistheDomain-SpecificLanguageorDSL.Thereissomedisagreementonexactlywhatthetermmeans,butforthepurposesofthisdiscussionwe'llrefertoitsimplyasalanguagethathasbeencreatedwithanarrowfocustosolveaparticularproblem,ratherthanasageneralpurposelanguagedesignedtosolveeverycomputingproblem.AssuchwewouldexpectaDSLtobenon-Turingcompleteandforthemostpartthisisthecase.Thereareedgecasesofcourse.Postscript,forexample,isaTuringcompletelanguagebutalsoqualifiesasaDSLusingourdefinition.Astheaboveexamplealsoillustrates,theideaofaDSLisnotnew.OtherfamiliarDSLsincludeRegularExpressions,XSLT,Ant,andJSP,allofwhichrequiresomesortofcustomparsertoprocessthem.MartinFowleralsosuggeststhatfluentinterfaces/APIscanbeconsideredasecondtypeofDSL,whichhereferstoasaninternalDSL.HisdefinitionisthataninternalDSLisdevelopeddirectlywithinthehostlanguage.ThiswasacommonpracticeamongstbothLispandSmalltalkprogrammers,andmorerecentlytheRubycommunityhasbeenpopularisingthetechnique.Whilstmanywell-knownDSLsarecommerciallydevelopedandmaintained,someenterprisedevelopmentteamshaveusedthetechniquetocreatealanguagethatallowsthemtorapidlyexploreaspectsoftheirproblemdomain.Itisn'thoweverascommonasitmightbe,perhapsbecauseDSLshaveafairlyintimidatingbarriertoentry.Theteamhastodesignthelanguage,buildtheparserandpossiblyothertoolstosupporttheprogrammingteam,andtraineachnewdeveloperthatjoinstheteamonhowtheDSLworks.HeretheemergenceoftoolstospecificallysupportDSLdevelopmentcouldsignificantlychangethelandscape.IntentionalSoftware'sIntentionalDomainWorkbench,whichhasbeenindevelopmentlongerthanJavahasbeenaround,isthefirstsignificantimplementationofsuchatool.TheprojectstartedlifeatMicrosoftResearch,andDr.CharlesSimonyi's1995paper"TheDeathofComputerLanguages,theBirthofIntentionalProgramming"describeshisvision.In2002SimonyifoundedIntentionalSoftwaretocontinueworkingonhisideasandahugelyimpressivevideodemoofthesystemisavailable.Theproductitselfisat1.0status,butaccessisrestrictedtoverylimitedpartners.Othersoftwarehousesarealsoexploringtheconcepts,amongstthemJetBrains,wellrespectedfortheirIntelliJIDEAJavaIDE,whohaverecentlyreleasedthe1.0versionoftheirMetaProgrammingSystem(MPS).MPSdoesn'tuseaparser,insteadworkingwiththeAbstractSyntaxTree(AST)directly.Itprovidesatext-likeprojectionaleditorwhichallowstheprogrammertomanipulatetheAST,andisusedtowritelanguagesandprograms.Foreachnodeinthetreeatextualprojectioniscreated-astheprogrammerworkswiththeprojection,thechangeisreflectedinthenode.Thisapproachallowsyoutoextendandembedlanguagesinanycombination(oftenreferredtoaslanguagecomposing)promotinglanguagere-use.JetBrainsareusingtheproductinternallyandhaverecentlyreleasedYouTrack,abugtrackingproductdevelopedusingthesystem.TheJava6AnnotationProcessorWhilstDSLsarelesscommoninmoremainstreamlanguagessuchasJavathantheyareinRuby,SmalltalkandLisp,recentdevelopmentsintheJavalanguage,inparticulartheannotationprocessorwhichwasaddedinJava6,offernewpossibilitiesfordeveloperslookingtousetheminJava.TheJPA2.0criteriaAPIthatwillshipaspartofJavaEE6,itselfaDSL,offersanexample.Heretheannotationprocessorbuildsupametamodeltypeforeachpersistentclassintheapplication.WhilstitwouldbeperfectlypossibleforthedevelopertohandcraftthemetamodelinJava,itwouldbebothtediousanderrorprone.Theuseoftheannotationprocessoreliminatesthatpainand,sincetheannotationprocessorisbuiltintoJava6,theapproachrequiresnospecificIDEsupport–anIDEdelegatestotheannotationprocessortriggeredbythecompiler,andthemetadatamodelisgeneratedonthefly.Usingtheannotationprocessoritisalsopossibleforalibrarytoaddanewlanguagefeature.BruceChapman'sprototype"noclosures"proposal,forexample,usesthetechniquetoprovideamechanismforcastingamethodtoaSingleAbstractMethod(SAM)typewhichcompilesontopofJava6.DuringourconversationChapmanpointedoutthattheSAMtypealsosupportsfreevariables,akeyaspectofaclosure:ThemethodbodycandeclareadditionalparametersbeyondthoserequiredfortheSingleAbstractMethodusingthe@As.Additionalannotation.TheseparameterscanhavevaluesboundtothematthepointwhereyouobtainaninstanceoftheSAMtype,andarethenpassedtothemethodeachtimeitisinvoked.ChapmanalsosetuptheRaptprojecttoexploreotherusesofthetechnique,andhasaddedimplementationsfortwolanguagechanges-MultilineStringsandXMLliterals-thatwereconsideredforJDK7butwon'tnowmakeitintothefinalrelease.Javacouldevengetaformofclosuressupportusingthisapproach.Whenaskedaboutthis,Chapmansaid:WearejustfinishingaSwingprojectwhichweuseditfor.Wehavefoundacoupleofminorbugsaroundgenerictypes,onerecentlydiscoveredremainstobefixedbutotherthanthatitseemsquitenicetouse,andnobodyhasbeenwantingtorushbacktouseconventionalanonymousinnerclasses.ProjectLombok,anotherprojectexploringthetheannotationprocessor,pushesthetechniquestillfurther.IneffectLombokusesannotationprocessingasahooktorunaJavaagentthatre-writesvariousjavacinternalsbasedontheannotations.Sinceitismanipulatinginternalclassesitisprobablynotsuitedtoproductionuse(internalclassescanchangeevenbetweenminorreleasesoftheJVM)buttheprojectisaneye-openingexampleofjustwhatcanbedoneusingtheannotationprocessor,including:

• Supportforpropertiesusingapairof@Getterand/or@Setterannotationswithvaryingaccesslevels,e.g.@Setter(AccessLevel.PROTECTED)privateStringname;• The@EqualsAndHashCodeannotation,whichgenerateshashCode()andequals()implementationsfromthefieldsofyourobject• The@ToStringannotation,whichgeneratesanimplementationofthetoString()method• The@datamethod,whichisequivalenttocombining@ToString,@EqualsAndHashCode,@Getteronallfields,and@Setteronallnon-finalfieldsalongwithaconstructortoinitializeyourfinalfieldsOtherlanguageexperimentation,suchasremovingcheckedexceptionsfromJava,canalsobedoneusingthisapproach.Whilsttheannotationprocessortechniqueopensupawelcomenewroutetolanguageexperimentation,careneedstobetakenthatthegeneratedcodecanbeeasilyreadbydevelopers,notjustbythemachine.Chapmanmadeanumberofsuggestionsduringourconversation:Generatesourcecodenotbytecode,andpayattentiontoformatting(indentingespecially)inthegeneratedcode.Thecompilerwon'tcarewhetheritisallononelineornot,butyouruserswill.Ievensometimesaddcommentsandjavadocinthesourcecodegeneratedbymyannotationprocessorswhereappropriate.HopefullyifthetechniquebecomesmoreprevalentIDEswillalsomakeiteasiertoviewthecodethatistobegeneratedatcompiletime.SyntacticSugarintheIDEBruceChapmanalsotouchesonourthirdtechnique-movingthesyntacticsugarfromthelanguagetotheIDE-inhisblogandheelaboratedonhisideasduringourconversation.ItisalreadyroutineforJavaIDEstocreateportionsofboilerplatecodeforyousuchasthegettersandsettersofaclass,butIDEdevelopersarebeginningtopushtheconceptfurther.JetBrains'IntelliJ9offersatersecodeblocksyntaxforinnerclassessimilartoaclosure,whichadevelopercanalsotype.Actinglikecodefolds,thesecanthenbeexpandedintothefullanonymousinnerclasseswhichthecompilerworkswith-thisallowsdeveloperswhoprefertostickwiththestandardanonymousinnerclasssyntaxtodoso.Asimilarplug-inforEclipsealsoexists.Thekeypointhereisthatthe"alternate"syntaxisjustaviewoftheactualcodewhichthecompilerandanysourcemanagementtoolscontinuetoworkwith.Thusthedevelopershouldbeabletoswitchviewsbetweeneitherform(likeexpandingorcollapsingacodefold),andanyonewithoutaccesstothedefinitionofthesugarjustseesthenormalJavacode.Chapmanwrites:Therearemanydetailstoworkoutinordertomakethiseasilyaccessible,butlongtermIseedevelopersrelativelyeasilydefiningatwowaysugaring/desugaringtransformation(jackpotisagoodstartforhowthismightbedone),tryingthemout,evolvingthemandsharingthegoodoneswithcolleaguesandthecommunity.Theadvantagesofthisarealmostthesameasforalanguagechange,withoutthedisadvantages.Theverybestcouldbecomeubiquitousandthenformthebasisofanactuallanguagechangeifnecessarytogetridofanyremaining"noise"notpossiblewiththisapproach.Sincesyntacticsugarhastomaptoanother(moreverbose)languagefeatureitcannotoffercompleteclosuresupport;therearesomefeaturesofBGGAclosuresforexamplethatcannotbemappedtoanonymousinnerclasses,andsotheycouldn'tbeimplementedthroughthisapproach.Neverthelesstheideaopensupthepossibilityofhavingvariousnewsyntaxesforrepresentinganonymousinnerclasses,similartoBGGAsyntaxorFCMsyntax,andallowingdeveloperstopickthesyntaxtheywanttoworkwith.Otherlanguagefeatures,suchasthenull-safeElvisoperator,couldcertainlybedonethisway.ToexperimentfurtherwiththeideathisNetBeansmodulealsodevelopedbyChapman,iswhathedescribesasa"barelyfunctional"prototypeforPropertiesusingth

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论