文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java/JavaScript/ABAP代码重构实例分析

2023-06-05 05:28

关注

本篇内容介绍了“Java/JavaScript/ABAP代码重构实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

在方法里引入一个布尔类型的参数控制方法的行为,这种做法正确吗?

Java/JavaScript/ABAP代码重构实例分析

看看stackoverflow上是怎么说的。

Java里这两种定义常量的方法,哪种更好?

Java/JavaScript/ABAP代码重构实例分析

package one;public interface Constants {  String NAME = "孙悟空";  int BP = 10000;}

package two;public class Constants {   public static final String NAME = "贝吉塔";   public static final int BP = 9000;}

为什么我们不应该在Java 接口中使用Array:

避免Array的原因之一:Array若使用不当,会造成性能问题

Java/JavaScript/ABAP代码重构实例分析

避免Array的原因之一:Array若使用不当,会造成性能问题

Java/JavaScript/ABAP代码重构实例分析

避免Array的原因之二:Array是面向过程编程领域的概念,使用Java面向对象的集合类,比如List,而不是Array

Java/JavaScript/ABAP代码重构实例分析

看个具体例子:

String[] array = { "乔布斯", "张小龙" };List list = Arrays.asList( array );System.out.println( list );// 打印输出 [乔布斯, 张小龙]System.out.println( array );// -> [Ljava.lang.String;@6f548414list.equals( Arrays.asList( "乔布斯", "张小龙" ) )// -> truearray.equals( new String[] { "乔布斯", "张小龙" } )// -> false

看出差距了吧?

Arrays不是类型安全的!

下面的代码能通过编译,但是运行时会报ArrayStoreException的异常:

Number[] numbers = new Integer[10];numbers[0] = Long.valueOf( 0 );

而使用JDK的集合类比如List,就能在编译器即检测出这类错误。

Javascript里有趣的逗号

function a() {  console.log("I was called!");  return "Jerry";}var b = a(), a;

然后执行下面的代码:

console.log(b);

会打印出Jerry

再看这段代码:

var d = (function c(){  return a(),a;})();console.log(d);

会打印出:

I was called!function a() {  console.log("I was called!");  return "Jerry";}

再看这段代码呢?

(function() {    var e = f = 1;})();

直接报错:Uncaught ReferenceError: f is not defined

JavaScript里有趣的分号

var b = function(para) {  return {  doSomething: function() {  console.log("hello: " + para);  return para;  }  }}var a = 1, x = 3, y = 4, ss = a + b(x + y).doSomething() // 打印出 hello: 7console.log(s) // 打印出 8function test(i){  var result = i++;  return  result}console.log("test: " + test(3)) // 打印出undefined

继续看这段代码

s = function(x){ console.log("called: " + x ); return x}(1 + 2).toString()s = function(x){ console.log("called: " + x ); return x}(1 + 2).toString()// 打印出 called: 3

小技巧 - 如何把您自己增强逻辑植入到legacy遗留代码中

var bigFunction = function() {      // big logic      console.log("big logic"); // 这句话模拟我们在一段很冗长的遗留代码里植入自己的新逻辑}// 下面这种解决方案不会直接修改遗留函数本身,显得比较优雅var _old = bigFunction;bigFunction = function() {    if ( _old ) {         _old();    }    console.log("our own enhancement");}bigFunction();// 第三种解决方案采用了面向切片编程思想,显得更加高级var bigFunction = function() {  // big logic  console.log("big logic");}bigFunction = ( bigFunction || function() {} ).after( function() {     console.log("our own logic");});bigFunction();

如何优雅的在一个函数里增添性能测试统计的工具代码

var append_doms = function() {    var d = new Date(); // dirty code - nothing to do with application logic!!!    for( var i = 0; i < 100000; i++) {      var div = document.createElement( "div");        document.body.appendChild(div);    }    // dirty code - nothing to do with application logic!!!    console.log(" time consumed: " + ( new Date() - d));};function test() {  append_doms();}

传统方案:在充满了业务逻辑的函数体里强行加入红色标准的搜集性能测试的工具代码,这个实现显得很丑陋:

Java/JavaScript/ABAP代码重构实例分析

再看看采用面向切片编程思路的解决方案:AOP - Aspect Oriented Programming

var append_doms = function() {    for( var i = 0; i < 100000; i++) {      var div = document.createElement( "div");        document.body.appendChild(div);    }};var log_time = function( func, log_name) {       return func = ( function() {           var d;           return func.before( function(){                 d = new Date();           }).after( function(){                 console.log( log_name + ( new Date() - d));           });     })(); };function test() { log_time(append_doms, "consumed time: ")();}

Java/JavaScript/ABAP代码重构实例分析

如何避免代码中大量的IF - ELSE 检查

Java/JavaScript/ABAP代码重构实例分析

在调用真正的OData API之前,系统有大量的IF ELSE对API的输入参宿进行检查:

var send = function() {     var value = input.value;     if( value.length === '' ) {           return false;     }     else if( value.length > MAX_LENGTH) {           return false;     }     ... // lots of else     else {        // call OData API     }}

更优雅的解决方案:

把这些不同的检查规则封装到一个个JavaScript函数里,再把这些函数作为一个规则对象的属性:

var valid_rules = {      not_empty: function( value ) {         return value.length !== '';      },      max_length: function( value ) {         return value.length <= MAX_LENGTH  ;      } }

实现一个新的检查函数,变量检查对象的属性,执行校验逻辑:

var valid_check = function() {     for( var i in valid_rules ) {          if ( vali_rules[i].apply( this, arguments) === false ) {                return false;          }     }}

现在的OData调用函数非常优雅了:

var send = function( value ) {       if ( valid_check( value ) === false ) {             return;       }      // call OData API}

Java/JavaScript/ABAP代码重构实例分析

通过这种方式消除了IF ELSE。

另一种通过职责链 Chain of Responsibility 的设计模式 design pattern消除IF ELSE分支的代码重构方式:

先看传统方式的实现:

// Priority: ActiveX > HTML5 > Flash > Form(default)function isActiveXSupported(){  //...  return false;}function isHTML5Supported(){  //...  return false;}function isFlashSupported(){  //...  return false;}

好多的IF -ELSE啊:

var uploadAPI;if ( isActiveXSupported()) {  // lots of initialization work  uploadAPI = { "name": "ActiveX"};}else if( isHTML5Supported()) {  // lots of initialization work  uploadAPI = { "name": "HTML5"};}else if( isFlashSupported()) {  // lots of initialization work  uploadAPI = { "name": "Flash"};}else {  // lots of initialization work  uploadAPI = { "name": "Form"};}console.log(uploadAPI);

再看职责链设计模式的实现:

Chain of Responsibility

var getActiveX = function() {  try {  // lots of initialization work  return { "name": "ActiveX"};  }  catch (e) {  return null;  }}var getHTML5 = function() {  try {  // lots of initialization work  return { "name": "HTML5"};  }  catch (e) {  return null;  }}

代码整洁优雅:

var uploadAPI = getActiveX.after(getHTML5).after(getFlash).after(getForm)();console.log(uploadAPI);

Java中的String

public class stringTest {public static void main(String[] args) {  String userName = "Jerry";  String skill = "JS";  String job = "Developer";  String info = userName + skill     + job;  System.out.println(info);}}

用javap将上面的Hello World程序反编译出来学习:

Java/JavaScript/ABAP代码重构实例分析

“Java/JavaScript/ABAP代码重构实例分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯