网站开发费怎么做账医药网站开发
news/
2025/9/23 2:01:31/
文章来源:
网站开发费怎么做账,医药网站开发,flash网站模板中心,分类信息网站 建议 建设简介#xff1a; 欲善其事#xff0c;先利其器。对于研发同学#xff0c;在日常的开发工作中#xff0c;我们与之打交道最多的便是编程的IDE。能否高效和灵活的使用IDE#xff0c;将对我们的工作效率起着举足轻重的作用。 一 、背景
1 、目的
欲善其事#xff0c;先利其…简介 欲善其事先利其器。对于研发同学在日常的开发工作中我们与之打交道最多的便是编程的IDE。能否高效和灵活的使用IDE将对我们的工作效率起着举足轻重的作用。 一 、背景
1 、目的
欲善其事先利其器。对于研发同学在日常的开发工作中我们与之打交道最多的便是编程的IDE。能否高效和灵活的使用IDE将对我们的工作效率起着举足轻重的作用。
研发同学在开发中最主要做的两件事分别是架构设计和编码前者主要取决于大量的项目经验积累和个人的思考深度也是作为研发的核心竞争力短时间内很难快速求成后者主要取决于日常的编码练习和一定程度的IDE信息差能够通过下文中介绍的一系列技巧进行能力的快速补齐和巩固加强。
本文的主要目的有两方面
一方面对IDE的快捷操作和高效技巧结合自己多年的实践和理解进行一次系统性的总结和梳理。另一方面希望通过本文系统性的梳理能够帮助更多的同学提高研发效率无论你是刚入手不久的新人还是有着多年开发经验的专家相信你都能够在本文中发现一片新天地让你能够有更多的时间和精力去做更有意义的事情。
2 、定位
网上很多技术网站和个人博客对于IDE各种技巧和便捷操作总结得非常具体且详细对于单点的详尽程度都是极具参考和学习价值的。但其对应的问题是这些很多很优秀的文章出自于不同的手笔有各自的行文风格且分散在各个网站的散点难以系统化。
我对本文的定位是将各种技巧以大分类的形式进行收拢和聚合以帮助大家构建和完善整体的知识体系大幅度提高开发效率。对于每个分类点到即止替代咀嚼式灌输方式的是尽量使用渐进式引导的方式。
3 、普适性
JetBrains系列的IDE产品众多除了下图之外还有其他未列入的如Google二次开发的Android Studio等。虽然归为多个产品实例但这些IDE的内核都是一样的只是在内核的基础上额外添加了各自的语言特性。本文将以使用量最高的一款IDE——IDEA为例进行展开文中提到的绝大多数能力和技巧在其他IDE均同样适用一通则百通。 二、 Postfix Completion
1 、介绍
Postfix Completion (下称Postfix) 是一种通过 . 模板Key 来对当前已经输出的表达式添加和应用预设代码模板的编码增强能力。
其核心要解决的问题是将编码过程中一些通用的代码结构范式进行抽象和沉淀并能在同类型的场景下通过 . 模板Key 的方式进行唤醒和复用。
举个例子现在需要完成下面一段代码的编写为了对name参数进行判空保护
if (name ! null) {}
在普通文本编辑器中其中 if 2次name 4次(){}! 共6次再加空格Tab和光标切换一共需要按键23次。
在IDEA编辑器中不使用Postfix时一共需要按键20次不考虑代码格式化的情况可以减少到16次。
在IDEA编辑器中使用Postfix时只需要8次如下图 在这个例子中可以对比出使用Postfix前后的效果使用之后在编码中减少了一半的手动按键操作且生成的代码是自带格式化的。在实际的编码过程中各项目大小和复杂度差异性虽然很大但细化到这种基本单位的编程范式时它们都是融会贯通的。
与上例中nn并列的PostfixIDEA给我们预设的还有很多下面对一些非常高频使用的Postfix进行梳理。
2 、梳理
var
快速定义一个局部变量自带IDE的类型推断 notnull
快速进行NPE的判空保护 nn
同notnull是它的简写推荐用这个更加便捷 try catch
快速对当前语句添加try catch异常捕获同时IDE还会对catch中的Exception自动做类型推断 cast
快速实现类型强转不需要反复使用()包裹和光标切换配合instanceof使用时还能自动实现cast类型的推断 if
快速实现if判断的代码范式 throw
快速实现抛异常 for
快速实现集合或数组的迭代 fori
快速实现集合或数组的带索引值迭代同时对整型数字也支持 sout/soutv
快速实现不带参数/带参数的打印功能 return
快速实现方法中的值返回逻辑 format
快速实现字符串格式化 3 、高级用法
担心系统预设的Postfix不足以满足我们的编码需求IDEA还提供了Postfix的自定义功能。
这里我以自定义一个对集合判空的代码范式来举例说明自定义Postfix的流程
1进入IDE设置界面然后依次进入Editor General Postfix Completion 面板左下角加号 Java 2在弹起的页面中按照下图进行配置然后保存退出设置页。 此时我们自定义的 isempty 这个Postfix即完成了下面来看下实际使用的效果 在实际开发过程中对于根据已经输入的表达式就能决定接下来代码格式的功能我们都能使用这种自定义方式进行代码的抽象和复用。
接下来介绍IDE中一种跟Postfix功能很相像但灵活度更高的能力——Live Template。
三、 Live Template
1、 介绍
介绍之前可以先看一段简短的编码过程 上面这段编码中我先后使用了Live Template的以下三个模板能力
psfs定义字符串常量main添加入口函数sout实现日志输出
这里我们将其和上面提到的Postfix对比来看两者都是提供代码级别模板的功能。不同的是Postfix需要一个已经输入的表达式和 . 模板Key 来进行触发而Live Template不需要这些它仅仅需要 模板Key 即可触发。
Live Template提供的预设模板要比Postfix要高出一个数量级因此这里我就不进行一一演示我们可以进行设置面板然后按照Editor Live Templates的路径自行查看如下图 2 、高级用法
和Postfix一样Live Template也支持自定义模板但它的自定义模板相对来说更加灵活和开放甚至支持我们直接植入脚本。鉴于Live Template的高度灵活性单独介绍这块会占据大量的篇幅因此这里我将从几个实际的案例场景来开拓一下思路而具体自定义拓展过程就不详细展开介绍了。
Key值映射
将DB中查询到 List 结构的数据根据Key值映射转化为 MapK, T 结构的数据以便于进行后续的数据填充逻辑 DB批量查询
在数据查询时我们会有根据ID主键进行批量DB数据查询的诉求如下
ListUser users userMapper.queryUserByIds(userIds);这种写法会有一个弊端就是当 userIds 大到一定的量级时该查询会变得非常耗时。
对于该问题其中一个解法是将这个大的 userIds 拆分成多个批次然后让这多个批次异步并行去查询。这里便使用Live Template来抽取一个针对该场景的代码模板如下 按照该模板我们的查询语句将变成这样
ListUser users batchQuery(userIds, 100, userMapper::queryUserByIds, null);可以看到和之前相比多传一个分批的size参数同时还支持指定的异步任务调度器的自定义配置而返回结果和之前的查询方式保持完全一致不需要外部有额外的适配工作。
脚本植入
这个功能是我非常看好Live Template的主要原因它的灵活性和拓展性也主要来源于这里。它支持我们通过一个 模板Key 来唤起和执行一段脚本这也就意味着我们的自定义的Live Template模板是可编程的极大程度提高了该模板的拓展性。
单描述功能会有些空洞这里我结合一个实际案例进行介绍我们来实现一个跨电脑的代码共享功能
1首先使用python的flask框架写一个极简的服务端应用并启动提供最简单的 push 和 pull 的能力如下
from flask import Flask, requestDEFAULT nothing
code DEFAULTapp Flask(__name__)app.route(/push)
def push():global codecode request.args.get(code, DEFAULT)return Successapp.route(/pull)
def pull():return codeapp.run()
2然后我们来通过groovy脚本实现一个代码 pull 的模板这里应用了Live Template的 groovy script 能力对应脚本如下
def url new URL(http://127.0.0.1:5000/pull);
def conn url.openConnection() as HttpURLConnection;
def result conn.inputStream.text;
return result
3最后再实现代码push的模板脚本如下下面的代码入参是通过剪切板赋值传递过来的
def code _1;
def url new URL(http://127.0.0.1:5000/push?code new URLEncoder().encode(code));
def conn url.openConnection() as HttpURLConnection;
def result conn.inputStream.text;
return result
此时就已经完成了跨设备的代码分享功能为方便演示这里就用 People1 和 People2 两个类来模拟两台独立的电脑。People1 将自己的一段代码复制到剪切板中然后通过 push 模板调用 push 接口来将这段代码上传到Python服务应用中People2 再通过 pull 脚本来调用服务端的 pull 接口访问到 People1 上传的代码并输入到当前的代码编辑器中实现效果如下图 这里的代码共享只是一个引子除此之外我们还能写很多有意思的脚本比如在IDE中查天气、通过IDE聊天等等自行脑补拓展。
介绍完Live Template之后接下来介绍文件级别的模板——File Template。
四 、File Template
1 、介绍
File Template顾名思义对应文件级别的模板。对于该模板我们使用脚本的主要在于两个场景分别是文件头和文件的自定义下面结合案例依次展开。
2 、自定义文件头
按照下图的路径来更改文件头的格式IDE就会在我们新建一个类或接口时根据这里的配置格式来自动生成对应的文件注释头。 3 、抽象通用Controller
看下面一段代码这是一个针对于User这个domain的增删改查接口类
package com.alibaba.ide.code.controller;import com.alibaba.ide.code.entity.Result;
import com.alibaba.ide.code.entity.User;
import com.alibaba.ide.code.service.Condition;
import com.alibaba.ide.code.service.UserService;
import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;
import java.io.Serializable;
import java.util.List;/*** author puke* version 2021/2/9*/
RestController
RequestMapping(api/user)
public class UserController {Resourceprivate UserService userService;PostMappingpublic ResultUser create(RequestBody User record) {User user userService.insert(record);return Result.success(user);}PutMappingpublic ResultUser update(RequestBody User record) {User user userService.update(record);return Result.success(user);}DeleteMapping({id})public ResultVoid deleteById(PathVariable Serializable id) {boolean success userService.deleteById(id);return success ? Result.success() : Result.fail();}GetMapping({id})public ResultUser queryById(PathVariable Serializable id) {User user userService.queryById(id);return Result.success(user);}GetMappingpublic ResultListUser queryByCondition(ConditionUser condition) {ListUser list userService.queryByCondition(condition);return Result.success(list);}
}
仔细看这段代码会发现如果基于该接口再新增另一个domain对应的Controller接口类代码中的基本结构和逻辑都是可以复用的。此时便是File Template排上用场的地方我们定义一个通用的 Controller 模板将共性的部分抽象到模板里再将差异性的部分通过模板入参 Subject 变量传入进来注这里需要用到Velocity 模板[1]的知识。
#set($SubjectOfLowerFirst ${Subject.substring(0,1).toLowerCase()} $Subject.substring(1))
package ${PACKAGE_NAME};import com.alibaba.ide.code.entity.Result;
import com.alibaba.ide.code.entity.${Subject};
import com.alibaba.ide.code.service.Condition;
import com.alibaba.ide.code.service.${Subject}Service;
import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;
import java.io.Serializable;
import java.util.List;#parse(File Header.java)
RestController
RequestMapping(api/${SubjectOfLowerFirst})
public class ${Subject}Controller {Resourceprivate ${Subject}Service ${SubjectOfLowerFirst}Service;PostMappingpublic Result${Subject} create(RequestBody ${Subject} record) {${Subject} ${SubjectOfLowerFirst} ${SubjectOfLowerFirst}Service.insert(record);return Result.success(${SubjectOfLowerFirst});}PutMappingpublic Result${Subject} update(RequestBody ${Subject} record) {${Subject} ${SubjectOfLowerFirst} ${SubjectOfLowerFirst}Service.update(record);return Result.success(${SubjectOfLowerFirst});}DeleteMapping({id})public ResultVoid deleteById(PathVariable Serializable id) {boolean success ${SubjectOfLowerFirst}Service.deleteById(id);return success ? Result.success() : Result.fail();}GetMapping({id})public Result${Subject} queryById(PathVariable Serializable id) {${Subject} ${SubjectOfLowerFirst} ${SubjectOfLowerFirst}Service.queryById(id);return Result.success(${SubjectOfLowerFirst});}GetMappingpublic ResultList${Subject} queryByCondition(Condition${Subject} condition) {List${Subject} list ${SubjectOfLowerFirst}Service.queryByCondition(condition);return Result.success(list);}
}
模板定义完成接下来来看一下实际的使用效果 这里使用 Goods 作为新的domain对象可以看到生成的 Controller 代码已经具备 UserController 的全部能力并且生成的代码全部都是 Goods 相关的api这样就实现了File Template的横向迁移能力。
五、 低频高效快捷键
1、 介绍
IDEA中的快捷键多达上百个我们很难把每个都记清楚网上也有很多对应的总结。这里我主要梳理一些大家使用相对比较低频但又非常高效的快捷键。
2 、梳理
选择重复元素Control G
通常情况下我们可以使用 Shift F6 对类名、方法名和变量名进行批量更改但对于其他元素进行批量更改时该快捷键特别合适且不限编程语言。 批量框选Option 鼠标左键拖拽
对于对齐的代码进行批量更改的最优解没有之一 整行移动Option Shift ↑/↓
快速调整代码执行顺序免除繁琐的剪切粘贴过程 整行/块复制Command D
对于整行/块的复制效率远高于纯手动的复制粘贴 展开/收起Command . or Command Shift /-
前者快速显示/隐藏当前方法体后者快速概览当前类的所有方法 修改方法签名Command F6
在方法被多文件或多处调用时该方式替换效率极高 查看历史剪切板Command Shift V
开发中经常会出现需要复制多个文本的诉求而PC默认的剪切板只能保存一个该功能专门用来解决这个痛点 代码抽取
代码抽取主要用在代码重构的时候以最快速度达到我们抽取一个变量、方法的目的。
1抽局部变量Command Option V 2抽成员变量Command Option F 3抽静态常量Command Option C 4抽方法入参Command Option P 5抽方法Command Option M 六、 代码调试
代码调试在开发中使用的非常多常规的单步、多步、进入、跳出操作这里也不特殊说明了。
有一点值得说的就是利用条件断点来实现运行期的代码植入功能先看下图 可以看到Debug模式运行时我们能动态改变 age 变量的值本来被赋值为 20 的结果输出出来却是 10。
这个是我在开发中无意间发现的一个功能算是一个Trick了。但这个功能在实际的开发过程中特别有用尤其针对于一些代码改动后再次运行的成本比较高的场景。比如Android开发过程中能够在不重新打整包的情况下动态修改页面中各个元素的样式、接口的请求、数据的内容等等再比如服务端场景中如果我们的应用支持Debug模式则可以通过该功能实现应用无需重新部署的情况下进行动态更改上下文逻辑的操作。
七、 写在最后
跬步至千里小流成江海开发工作有大小业务需求有缓急但终究要落到眼下从一砖一瓦的基石开始从一行一列的编码开始希望本文中能帮助到更多的研发同学。
作者开发者小助手_LS
原文链接
本文为阿里云原创内容未经允许不得转载
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/911063.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!