精华内容
下载资源
问答
  • 软件功能设计
    千次阅读
    2017-10-31 21:19:13

             软件功能设计:

             针对软件中某一具体的功能,所进行的设计。包括:这个功能的实现方式,实现的基本结构,类的组成,职责划分等,是软件设计中最最重要的基本功。

             功能设计在整个软件设计中的层次:

             软件设计的层次很多,不同的软件设计过程有不同的划分层次,大致可分为:架构设计,api/spi设计,数据库设计,功能设计,类设计,方法设计。

             从难度上说:公共类库》公共框架》基础平台/框架》应用(产品》项目)

            功能设计在整个软件设计中的地位:

            功能设计从属于详细设计,是整个系统功能实现的基石。

            功能设计与设计模式的关系:

            功能设计通常会综合应用多种设计模式,是各种设计思想的具体体现的载体。由于功能千变万化,因而要有较高的设计技巧和功力,才能设计出正确的,易用的,灵活的,         扩 展性高的,高性能实现。

            设计模式是业界公认的,优秀的设计经验和设计理念,理解、掌握、融会贯通、并能熟练变形应用设计模式,对于功能设计是由极大的帮助的。

            功能设计与详细设计的关系:

            功能设计只是详细设计中的一部分,详细设计还包括很多其他的设计,比如:流程设计、对api/spi的完善和细化,对数据库设计的完善和细化,对多个功能交互的控制,事         务 的规划,权限/安全的规划,例外的控制。。。很多很多

             功能设计要考虑的东西/评价标准:

            这个业界没有统一的标准,而且不同类型、不同业务的系统考虑的东西并不完全一样,但还是有一些通常要考虑的东西:

            “正确性”,易用性,可扩展性,复杂性(易理解,开发难度等),易维护,安全,性能,可重用,可测试。。。

             软件设计的实战方法---经验总结

             1,基本的功能实现方式,并进行细化;

             2,分析每个步骤,每个细节中,哪些是可变的,哪些是不可变得。通常分析3个部分:数据的输入,具体实现,数据产出;

             3,分析这个细节功能和其他步骤的关系,比如:顺序,平行,依赖等,已确定这些职责的粒度和分离方式,从而考虑他们之间的组合方式,也需要分离这些组合方式的变           与不变

              4,根据前面分析的结果,进行相应的类,方法的设计、进行职责的划分,并通过合适的方式把他们组织起来。

                      通常这个时候,就会融合进一个或多个设计模式的应用。当然也可能是没有现成的设计模式,需要自己来灵动的组织和实现。

              5,按照前面讲述的评价标准,进行系统的思考和调整,以形成最终的设计方案。


           关于软件设计的一些思考:


           设计的基本技巧:发现和封装变化,进行抽象和封装,实现高内聚和低耦合。

           设计是危险的平衡艺术,尽可能的找到最佳平衡点。

           没有完美的设计,设计总是在不断的演变中

          设计是没有标准答案的,只要能更好的实现功能,更好的满足那些评价标准,就是好东西。

         不要过度设计不等于不设计,而是更要精巧设计。

         关于重构的思考:在设计角度讲,重构是打补丁的思想。

         关于敏捷的思考:

         设计是否增加了复杂度:

         设计是否增加了软件成本:好的设计是会降低软件成本的。

        

       

            




            

           

            

             


    更多相关内容
  • Redis签到功能设计与实现

    万次阅读 2021-02-25 21:42:55
    设计实现与分析 但从此功能的实现上来说,似乎并不是太难,我们完全可以通过创建一个如下简单的表实现 和上一篇一样的思路,设想你的APP的用户量是像QQ或微信那种量级的,每天签到的人数加起来该有多少?你的这张表...

    前言

    在很多社交类APP中,签到功能似乎成了标配,签到功能一方面可以促进APP中用户的活跃度,而且可以绑定一些促销活动刺激用户消费等关联功能
    在这里插入图片描述

    设计实现与分析

    但从此功能的实现上来说,似乎并不是太难,我们完全可以通过创建一个如下简单的表实现
    在这里插入图片描述

    和上一篇一样的思路,设想你的APP的用户量是像QQ或微信那种量级的,每天签到的人数加起来该有多少?你的这张表够不够承载一年365天这么庞大用户体量的数据

    就算可以借助mysql的索引功能加速查询,但是总有一天,该表所在的服务器会有撑不住的一天,而使用那些分库分表之类的方案来解决这个签到这样的非核心业务功能似乎又显得奇葩

    有没有一种更好的方案来解决这个问题呢?答案是肯定的,就是使用redis提供的bitmaps的数据结构来处理

    bitmaps简介

    • Redis的Bitmaps这个“数据结构”可以实现对位的操作。Bitmaps本身不是一种数据结构,实际上就是字符串,但是它可以对字符串的位进行操作
    • 可把Bitmaps想象成一个以位为单
    展开全文
  • Java+MySQL实现评论功能设计开发

    万次阅读 多人点赞 2018-08-13 09:39:52
    Java+MySQL实现评论功能设计开发 一、背景 项目初始版本上线,有时间写点东西记录一下项目中的心得体会,通过这个项目学习了很多,要写下来的有很多,先从评论功能开始吧。由于项目需要增加评论功能,之前并无此...

                                                    Java+MySQL实现评论功能设计开发

    一、背景

          项目初始版本上线,有时间写点东西记录一下项目中的心得体会,通过这个项目学习了很多,要写下来的有很多,先从评论功能开始吧。由于项目需要增加评论功能,之前并无此方面的经验,因此项目开始的一段时间都在寻思着如何进行评论功能的设计。上网搜索一波发现有很多优秀的第三方评论插件可以使用,本来准备直接采用的,但是心里始终有点疙瘩,可能是评论数据放在别人那里不放心的原因,或可能是想一探这些评论系统的究竟,因此最终决定自行设计开发这么一套评论功能。效果截图如下所示,采用的是MySQL数据库,编程语言用的Java。(更多内容,可参阅程序员在旅途)

    二、评论系统的概述:

           评论功能是用户表达对某一主题的想法的很好的一种方式,优秀的评论系统能很好地提高社区的活跃度。各大主流网站也都提供了相应的评论支持。比如:贴吧,新闻类门户网站(APP),UC浏览器等等。

          各大网站侧重点不同,对评论功能的要求就不一样,设计出来的评论系统自然就不一样。可能会有:①只可以进行评论,不可以回复,②既可以进行评论,也可以进行回复,然后在这个基础上可能会增加一些额外的功能,比如评论的折叠,审核,优选等。另外,一个良好的UI显示也是非常重要的,能给用户一个直观的视觉上的体验也是评论功能不可或缺的一个要素,毕竟用户都是具有很强的审美能力的,用户的使用体验决定了项目的需求。

          对于本项目,设计的是,既可以评论,也可以进行回复,评论和回复分开存储。在显示上,评论和回复显示的位置不同,回复相较于评论向右靠一些,这样,看起来比较舒适,当然也可以设置成其他的样式。评论会显示评论者头像,回复不会。

          评论的管理:后台系统应该具备基本的评论管理功能,比如:删除,折叠,优选,排序。这些功能的实现依赖于数据库表的设计,所以,在开始设计的时候,要想清楚自己的项目需要哪些功能。

    三、数据库表的设计:

         本评论功能采用评论和回复分离的方式进行存储,一共设计了两张表,一张用户评论表(comment),一张针对评论的回复表(comment_reply)。评论表主要保存对文章或者回答的评论,回复表保存对每一条评论的回复。

          评论表(comment)如下图:主要包括了:评论ID(作为回复表的主键),回答(文章)ID,评论者ID,评论内容,点赞数,评论时间,审核状态

         评论回复表(comment_reply)如下图:主要包括了:评论ID,用户ID,被回复人ID,回复内容,点赞数,回复时间。

          两张表通过comment_id联系起来(并没有设置主外键,主要是不想维护起来太麻烦),获取某一答案的评论及回复步骤:根据answer_id找到所有的评论,然后,遍历所有的评论,根据comment_id查询到所有的回复(评论者的基本信息,例如头像,名称等需要额外查询)。需要注意的是,在评论和回复数据较多的情况下做好分页处理。

    四、程序的实现: 

          采用Java语言进行编程的实现,使用的SSM框架。主要的功能代码如下所示(因为项目有通知功能,看的时候可以略过这部分,跟单纯的评论功能没有太大关系,但是一般要有通知,后面有时间会写站内通知的设计与开发博客):

       4.1 添加评论代码如下:(获取到评论相关的参数,然后进行向数据库表插入)

    public int addComment(Comment comment) {
    	try {
    		Answer commentAnswer = answerMapper.selectByPrimaryKey(comment.getAnswerId());
    		Long commentId = IDUtils.genItemId();//评论ID
    		Date createtime = new Date();
    		//1,填补comment对象的其他参数,进行插入
    		comment.setCommentId(commentId);
    		comment.setState(1);//状态: 0 待审核,1通过,2不通过
    		comment.setPraseCount(0);//一开始插入的点赞数设置为0
    		comment.setCreatetime(createtime);
    		comment.setUpdatetime(createtime);
    		commentMapper.insert(comment);//插入comment记录
    		//2,跟新Answer的相关一条数据,提示评论数+1
    		commentAnswer.setCommentNum((commentAnswer.getCommentNum()==null?0:commentAnswer.getCommentNum()) + 1);
    		answerMapper.updateByPrimaryKeySelective(commentAnswer);
    		//3,向提醒表插一条数据。这条评论是发给谁的,通知表里面的userId就是谁
    		if (comment.getUserId() != commentAnswer.getUserId()) { //自己评论自己不会有通知
    			Remind remind = new Remind();
    			remind.setRemindId(commentId);
    			remind.setUserId(commentAnswer.getUserId());
    			remind.setFromUserId(comment.getUserId());
    			//commentType:1评论回答,2评论别人的评论,3关注,4支持,5反对,6添加回答
    			remind.setRemindType(1);
    			//已读:0否,1是
    			remind.setReadStatus(0);//否
    			remind.setCreatetime(createtime);
    			//插入通知内容,以json的形式存储
    			RemindContent remindComment = new RemindContent();
    			remindComment.setContentId(commentAnswer.getAnswerId());
    			remind.setContent(JsonUtils.objectToJson(remindComment));//通知内容。回答问题的Id
    			remindMapper.insert(remind);
    		}
    		//返回1代表成功
    		return 1;
    	} catch (Exception e) {
    		e.printStackTrace();
    		return 2;
    	}
    }

     4.2 添加回复代码:(前台会传来评论的ID,然后,封装成回复对象进行插入,一个评论ID会对应很多回复)

    public int addCommentReply(CommentReply commentReply) {
        Long commentId = IDUtils.genItemId();//评论ID
        Date createtime = new Date();
    	commentReply.setPraseCount(0);
    	commentReply.setCreatetime(createtime);
    	int retVal = commentReplyMapper.insert(commentReply);
    	  
        //3,向提醒表插一条数据。这条评论是发给谁的,通知表里面的userId就是谁
    	if (commentReply.getReplyuserId() != commentReply.getUserId()) {
    	    Remind remind = new Remind();
    		remind.setRemindId(commentId);
    	    remind.setUserId(commentReply.getReplyuserId());
    		remind.setFromUserId(commentReply.getUserId());
    		//commentType:1评论回答,2评论别人的评论,3关注,4支持,5反对,6添加回答
    		remind.setRemindType(2);
    		//已读:0是,1否
    		remind.setReadStatus(1);
    		remind.setCreatetime(createtime);
    		remind.setContent(commentReply.getCommentId()+"");
    		remindMapper.insert(remind);
    	}
    	return retVal;
    }

     4.3获取某一回答的评论和回复(评论分页返回,但是回复没有分页,后面会优化,使用的是pagehelper插件):

    public PageBean<CommentStatus> listAnswerComments(Long answerId,Integer pageNum,Integer pageSize) {
    try {
    	CommentExample commentExample = new CommentExample();
    	commentExample.setOrderByClause("createtime DESC");
    	Criteria commentCriteria = commentExample.createCriteria();
    	commentCriteria.andAnswerIdEqualTo(answerId);
    	PageHelper.startPage(pageNum, pageSize);
    	List<Comment> commentList = commentMapper.selectByExampleWithBLOBs(commentExample);//获取具有分页结果的评论数据
    	List<CommentStatus> commentStatusList = new ArrayList<>();
    	for (Comment comment : commentList) {
    		CommentStatus commentStatus = new CommentStatus(); //评论返回的具体对象
    			
    		CommentReplyExample example = new CommentReplyExample();
    		com.pn.mini.model.CommentReplyExample.Criteria criteria = example.createCriteria();
    		criteria.andCommentIdEqualTo(comment.getCommentId());
    		List<CommentReply> commentReplyList = commentReplyMapper.selectByExample(example);
    		List<CommentReplyStatus> commentReplyStatusList = new ArrayList<>();
    		for (CommentReply commentReply2 : commentReplyList) {
    			UserBaseInfo commentUser = userBaseInfoMapper.selectByPrimaryKey(commentReply2.getUserId());
    			UserBaseInfo commentReplyUser = userBaseInfoMapper.selectByPrimaryKey(commentReply2.getReplyuserId());
    			CommentReplyStatus commentReplyStatus = new CommentReplyStatus();
    			commentReplyStatus.setCommentId(commentReply2.getCommentId());
    			commentReplyStatus.setContent(commentReply2.getContent());
    			commentReplyStatus.setCreatetime(commentReply2.getCreatetime());
    			commentReplyStatus.setPraseCount(commentReply2.getPraseCount());
    			commentReplyStatus.setReplyuserId(commentReply2.getReplyuserId());
    			commentReplyStatus.setReplyuserName(commentReplyUser.getUserName());
    			commentReplyStatus.setUserId(commentUser.getUserId());
    			commentReplyStatus.setUserName(commentUser.getUserName());
    			commentReplyStatusList.add(commentReplyStatus);
    		}
    		UserBaseInfo commentUserBaseInfo = userBaseInfoMapper.selectByPrimaryKey(comment.getUserId());
    		CommentIntegrate commentIntegrate = new CommentIntegrate();
    		commentIntegrate.setAnswerId(comment.getAnswerId());
    		commentIntegrate.setAvatar(commentUserBaseInfo.getAvatar());
    		commentIntegrate.setCommentId(comment.getCommentId());
    		commentIntegrate.setContent(comment.getContent());
    		commentIntegrate.setCreatetime(comment.getCreatetime());
    		commentIntegrate.setPraseCount(comment.getPraseCount());
    		commentIntegrate.setState(comment.getState());
    		commentIntegrate.setUpdatetime(comment.getUpdatetime());
    		commentIntegrate.setUserId(comment.getUserId());
    		commentIntegrate.setUserName(commentUserBaseInfo.getUserName());
    		//拼接一条评论的返回对象
    		commentStatus.setCommentIntegrate(commentIntegrate);
    		commentStatus.setCommentReplyStatusList(commentReplyStatusList);
    		commentStatusList.add(commentStatus);
    	}
    	PageBean<CommentStatus> recCommentItemBean = null;//接口返回的对象
    	PageInfo<Comment> pageInfo = new PageInfo<>(commentList);
    	recCommentItemBean = new PageBean<>(commentStatusList);
    	recCommentItemBean.setDataList(commentStatusList);
    	recCommentItemBean.setPageNum(pageInfo.getPageNum());
    	recCommentItemBean.setPages(pageInfo.getPages());
    	recCommentItemBean.setPageSize(pageInfo.getPageSize());
    	recCommentItemBean.setSize(pageInfo.getSize());		 
        recCommentItemBean.setTotal(pageInfo.getTotal());
    	return recCommentItemBean;
    			
    	} catch (Exception e) {
    		e.printStackTrace(); //出现异常返回null,controller根据此判断此处调用是否成功
    		return null;
    	}	
    }

     4.4  优化思考:

       ① 回复没有分页返回,回复数据量大的时候需要分页,在在获取回复的时候分页一下即可。

       ② 获取一条信息,需要再去查询用户表,获取用户的信息,这样就会导致获取一条回答的评论和回复需要查询N次数据表,思考的是增加冗余字段(用户名,用户头像),然后减少这方面的查询开销,当用户头像和名称更改的时候,同步更改这里面的数据,但是一般用户的这方面信息更改较少,总的来说,增加这个冗余字段还是能很大程度提高效率的。

      ③优化后的数据库表如下(忽略hot_value这样的字段,不同项目有不同需求):

    五:总结与反思(后续优化的方向):

           虽然评论功能开发完毕,在目前也可以正常的使用,待使用程序的用户的增加,流量的扩大后仍需要继续优化,不然在用户的使用体验上可能会很糟糕,尤其是当数据量大的时候,用户访问可能会感觉到有些慢。不足之处其一:在于获取评论的回复,每次读取数据的时候,需要遍历每一条评论,然后去查找这个评论下的所有回复,之后返回这些数据,这样就会造成获取一片文章的评论需要多次查找数据库,效率就会很低,下一步准备从数据库设计和程序实现两个方面去思考如何优化;其二在于:所有文章的评论都在一张表里面,评论的回复也都在一张表里面,这样就会导致表的条目很多,下一步优化的思路集中于分表操作,具体的实现还在思考中。。。。

         评论功能的设计还有很多需要优化的地方,欢迎对这方面有了解的小伙伴一起交流。

    展开全文
  • 一、系统功能设计

    千次阅读 2018-05-10 18:50:15
    仿QQ系统功能结构共分为5个部分,分别市软件登陆、Q友主界面、聊天窗口、个人信息设置、添加好友

    仿QQ系统功能结构 共分为5个部分,分别是软件登陆、Q友主界面、聊天窗口、个人信息设置、添加好友
    展开全文
  • 用户登录功能设计思路

    万次阅读 2017-10-15 19:40:20
    实现安全用户登录功能浅析 1、用户登录注册 登录注册页面前端部分内容,关注的重点还是用户账号和密码在js代码里要做对应正则的匹配,这是验证的第一步,保证用户输入格式的正确性同时也从一方面减少用户向后台...
  • 商品收藏模块的功能设计实现

    万次阅读 热门讨论 2017-05-25 13:46:59
    电商网站的商品收藏功能实现  商品收藏的功能描述:用户对一件商品重复的进行收藏与取消收藏操作。...已收藏;... 下面是我设计功能的步骤以及关键代码:  1.首先创建一张收藏表:我的收藏表只有三
  • 个人博客系统中的评论功能设计

    千次阅读 2017-03-19 17:09:51
    1、效果如下,盖楼形式,第一条是评论,下面是对评论的回复 2、数据库设计 remark表存储对博客的评论 外键:blog_id reply表存储对remark的回复 外键:remark_id3、remark和reply连接查询
  • 数据库设计——评论回复功能

    万次阅读 多人点赞 2017-05-03 02:43:48
    本文主要介绍评论功能的数据库设计。评论功能最主要的是发表评论和回复评论(删除功能在后台)。评论功能的拓展功能体现有以下几方面: (1)单篇文章的评论数量和信息展示; (2)从时间维度,按照时间倒
  • 第一篇,包括:缘起、技术需求、功能规划、功能设计
  • 架构设计之非功能性需求

    千次阅读 2019-01-02 13:10:20
    功能性需求包括性能、可修改性、可用性、易用性、复用性、环境要求等,在最初的需求方案分析阶段很容易被忽略,而这些内容的考虑往往会影响到产品的实现,包括功能架构、详细设计都会用到。 非功能性需求为何与...
  • 为什么需要功能需求设计说明书

    千次阅读 2017-04-11 12:01:40
    为什么需要功能需求设计说明书在没有功能设计文档时,主要有如下几个问题: 前期研究团队沟通成本如何要让团队里面的所有人员对软件产品的功能需求设计有一个共识?没有功能设计文档,反正我是想不出有什么办法。当...
  • 二、功能需求与模块设计

    千次阅读 2019-09-05 14:15:35
    功能需求与模块设计 功能需求 本项目主要实现信息管理系统中的用户与权限管理的通用模块,功能要求如下: (1)用户管理:实现用户的增删改查和用户的角色分配。 (2)权限管理:实现权限的增删改查。 (3)...
  • 为了方便中小型企业想拥有自己的商城而设计,他不单单是一个网上商城,还是一个强大的线下商品进销存管理系统。 二、功能模块 1、用户功能模块 为了更好的对系统进行管理和维护,设定了不同权限的用户来管理商城...
  • 系统设计文档

    万次阅读 多人点赞 2020-05-15 20:59:21
    系统设计文档1 系统需求分析1.1可行性分析1.2项目要解决的问题1.3项目目标2 功能设计2.1功能划分2.2功能描述2.2.1电影信息查询2.2.2用户偏好推荐2.2.3用户登录功能2.3功能设计2.3.1用例图2.3.2 E-R图3 详细设计3.1...
  • 【微信朋友圈点赞】功能测试用例设计

    万次阅读 多人点赞 2019-08-29 21:55:27
    主要从界面、功能、兼容性、性能、并发等几个角度进行设计,至于安全性这块,不知道针对这个功能应该如何进行,所以未涉及 主要的测试点在功能测试,尽力覆盖了能想到的常用功能的测试点 带星标的,是参考其他文章...
  • 公告(通告),消息,提醒等基本功能数据库设计1.公告announcement: 平台发,用户收.分实时公告和非实时公告.优先级:紧急,高,普通. 平台可以向单个用户发,可以向多个用户发,可以向某一用户类型发,可以向全部用户发. 公告...
  • 实现登陆功能——用户登录设计

    万次阅读 2018-07-12 15:16:17
    3.实现用户登陆功能 1)客户端程序编写MD5工具类实现对输入密码传输过程中进行加密和存储过程中加密 2)前端页面通过BootStrp {static js/css }构建页面布局。点击登陆时候可以通过脚本实现对输入密码进行一次...
  • https://bbs.csdn.net/topics/350235311
  • 系统设计中的非功能性需求

    万次阅读 2018-01-30 22:19:55
    App或者网站的访问量弹性很大,刚开始的时候访问量可能比较小,随着市场推广进行,访问量可能急剧增加,或者随时间的波动,访问量变化很大,这需要在设计的时候将系统进行很好的切割,分成功能单一的服务,根据各个...
  • 私信基本功能数据库设计

    万次阅读 多人点赞 2015-10-21 15:07:25
    私信功能,实现像对方发送私信消息后,在我的私信列表页面显示与发送或者接受消息的人列表,列表每条记录只显示与该对话的最新的一条消息。 点击列表中的任意一条,进入到消息对话详情页面,按照倒序显示该对话的...
  • 软件设计的总体思路

    万次阅读 2019-01-08 15:16:02
    软件设计的本质就是针对软件的需求,建立模型,通过将模型映射为软件,来解决实际问题。因此软件设计需要解决的核心问题是建立合适的模型,使得能够开发出满足用户需求的软件产品,并具有以下特性: 灵活性...
  • 网站评论功能数据库设计和开发

    万次阅读 多人点赞 2016-05-18 20:40:12
    本文主要分享了我在设计评论模块中的一些心得,希望对读者有些许帮助。 需求分析 现阶段评论做的最好的我想应该是网易新闻(app)里面的评论模块了,其...在设计评论模块前可以和pd或者boss沟通,我们的评论功能
  • 4.2系统主要功能模块设计: (1)基本信息模块:是管理员对学生信息进行添加操作。通过本界面管理员可以对学生信息进行相应的修改,包括学号、姓名、出生日期等。可以通过该界面输入学生姓名实现查询该学生的所有...
  • 功能需求分析和数据库设计 不论是Web开发还是Android开发,在设计后台的时候我们都要做的重要的事情不外乎两点:1. 需求分析;2.数据库表格的设计。在进行这两项工作的过程中,第一项工作对第二项起着非常重要的...
  • 需要实现的功能如下: 1.评论提醒。 实现功能 他人回复自己后,右上角自动提醒“未阅读的新消息”的数量。 点击后,清空新消息的提示。 思路 这个是最简单的。在数据库查询: select count(id) from 评论表...
  • 学习软件设计的非功能性需求

    千次阅读 2014-03-20 22:54:38
    功能需求是产品必须具备的品质或者它将事情做到了多好,它们可以让产品有吸引力、易于使用、快速、可靠或者安全。通常并不改变产品的功能功能性需求是让产品工作的需求,非功能需求是为工作赋予特征的需求。所以...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,033,452
精华内容 1,213,380
关键字:

功能设计