代码评定审查歪诗起名

(1) $gt    > (大于)   

        贾言
     

五笔者:sarah

       

 

       

(4) $lt  <= (小于等于)  

明勋品德阳。

 

  验幻空越重  — 言欢空月虫

  验:公共措施都要做参数的校验,
 参数校验不经过显明抛出尤其或对应响应码。

  1.     java bean验证早已是三个很古老的技能了, 会制止大家很多题材,
    可参看:    
              http://beanvalidation.org/
    http://www.infoq.com/cn/news/2010/03/javaee6-validation
    https://www.sitepoint.com/using-java-bean-validation-method-parameters-return-values/
         
  2.     在接口中也鲜明使用验证申明修饰参数和重返值,
    作为一种协议必要调用方按表明申明约束传参,
    重回值验证声明约束提供方按注脚供给回到参数  

  幻:在代码中要杜绝幻数,幻数可定义为枚举或常量以增加其可读性

  空:要每一日警醒空指针分外

  1.     常见的 a.equals(b) 要把常量放到左边  
  2.     aInteger == 10 假设 aInteger 为空时会抛出空指针至极  
  3.     不肯定再次回到集合是不是可为空时要做非空判断, 再做for循环  
  4.     使用空对象情势, 约定重临空集合, 而非null  
  5.     使用StringUtils判断字符串非空          
         

  越:借使措施传入数组下标作为参数,要在一上马就做下标越界的校验,幸免下标越界至极

  重:不要写重复代码,重复代码要采用重构工具提取重构

 

 

命循频异长。

删除

       

修改

       

剔除有多个操作 remove()和drop()

  命循频异长 -明勋品咸阳

  命:包/类/方法/字段/变量/常量的命名要遵循规范,要名副其实,那不只可以够增添可读性,还能在起名的进程中指导大家思考格局/变量/类的义务是或不是合适

有含义很关键, 典型无意义命名:

public static final Integer CODE_39120 = 39120;
public static final String MESSAGE_39120 = "[包裹]与[库房号]不一致,确定装箱?";
public static final Integer CODE_39121 = 39121;
public static final String MESSAGE_39121 = "[包裹]与[箱号]的承运类型不一致,确定装箱?";
 
Rule rule1 = request.getRuleMap().get("1050");

CODE_39120以此名字和幻数没多大差异。

  循:不要在循环中调用服务,不要在循环中做数据库等跨网络操作

  频:写每一个办法时都要精晓这些方法的调用频率,一天微微,一分多少,一秒多少,峰值大概完毕多少,调用频率高的肯定要考虑质量目的,考虑是还是不是会打垮数据库,是或不是会击穿缓存

  异:十分处理是程序员最主题的素质,不要四处捕获非常,对于捕获了只写日记,没有其余处理的catch要问一问自个儿,这样吃掉那么些,是不是成立

下边是二个反例, 在导出文件的controller方法中做了两层的try…catch,
在catch块中记录日志后什么都没做, 那样用户看不到真正想要的内容,
研究开发也唯有看日志才能发现错误, 而“看日志”,
日常只有业务方反馈难点时才会看,
就会招致研发职员发现错误会比现场职员还会晚。

@RequestMapping(value = "/export")
public void export(CityRelationDomain condition, HttpServletResponse response) {
   ZipOutputStream zos = null;
   BufferedWriter bufferedWriter = null;
   try {
      condition.setStart(0);
      condition.setSize(MAX_EXPORT_LINES);
      List list = cityRelationService.getOrdersByCondition(condition);
      response.setCharacterEncoding("GBK");
      response.setContentType("multipart/form-data");
      response.setHeader("Content-Disposition", "attachment;fileName=export.zip");
      zos = new ZipOutputStream(response.getOutputStream());
      bufferedWriter = new BufferedWriter(new OutputStreamWriter(zos, "GBK"));
      bufferedWriter.write("订单类型编码,始发城市-省,始发城市-市,目的城市-省,目的城市-市");
      ZipEntry zipEntry = new ZipEntry("export.csv");
      zos.putNextEntry(zipEntry);
      for (CityRelationDomain domain : list) {
         try {
            bufferedWriter.newLine();
            bufferedWriter.write(CSVExportUtil.trans2CSV(domain.getOrderCode()));
            bufferedWriter.write(',');
            bufferedWriter.write(CSVExportUtil.trans2CSV(domain.getProvinceNameFrom()));
            bufferedWriter.write(',');
            bufferedWriter.write(CSVExportUtil.trans2CSV(domain.getCityNameFrom()));
            bufferedWriter.write(',');
            bufferedWriter.write(CSVExportUtil.trans2CSV(domain.getProvinceNameTo()));
            bufferedWriter.write(',');
            bufferedWriter.write(CSVExportUtil.trans2CSV(domain.getCityNameTo()));
         } catch (Exception e) {
            e.printStackTrace();
         }
      }
      bufferedWriter.newLine();
           bufferedWriter.flush();
           zos.closeEntry();
           bufferedWriter.close();
   } catch (Exception e) {
      e.printStackTrace();
      logger.error("导出CSV文件异常");
   } finally {
      try {
         if (zos != null) {
            zos.close();
         }
         if (bufferedWriter != null) {
            bufferedWriter.close();
         }
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

  长:假若一行代码过长,要诠释开来;要是1个情势过长,要重构方法;要是三个类过长要考虑拆分类

比方想询问某一组音信,比如说三个信息列表的时候,大家就足以作用find();

  依轮线日简 -依伦先日贱

  依:尽管调用了外部正视,一定要搞掌握那么些外部信赖能够提供的品质目标,最好约定SLA

  轮:不要再一次造轮子,假如已经有成熟类库达成了类似效率,要先期选取成熟类库的法门,那是因为成熟类库中的方法都因而无数人的测试评释,平时情形下大家协调实现的材料最大等同于成熟类库的身分。

  线:要留心大家的jsf服务,
web应用,消费音信的worker都以二十四线程环境,要注意线程安全难点,最非凡的HashMap,
SimpleDateFormat,
ArrayList是非线程安全的,此外固然运用Spring自动扫描服务,那么那些服务暗中同意是单例,当中间成员是三个线程共享的,若是一贯用成员变量是有线程不安全的。

八个典型的错误代码片段:

  1)无视SimpleDateFormat非线程安全

@Service
public class AService {
    private static final SimpleDateFormat FORMAT = new SimpleDateFormat("yyyy-MM-dd");

    public void doSomething() {
        //use FORMAT
    }
}

 

  2)使用Service成员变量

@Service
public class BService {
    private Pojo b;

    public void doB() {
         b = getB();
         process(b);
    }
}

 

  日:打字与印刷日志和设定合理的日记级别,如有须求要添加if条件限制是或不是打字与印刷日志,在日记中应用JSON种类化,生成长字符串的toString()都要做if限定打字与印刷,不然配置的日记级别没达到规定的标准,也会做大量字符串拼接,占用很多gc年轻代内存.
 此外一定要通过log4j打字与印刷日志而不是一向把日记打字与印刷到控制台。

 

一流错误示例:

@Service
public class FooService {
    private static final Logger LOGGER = LoggerFactory.getLogger(FooService.class);

    public void doFooThing(Foo foo) {
        LOGGER.debug("get parameter foo {}", JSONObject.toString(foo));
        try {/*do something*/} catch (Exception ex) {ex.printStackTrace();}
    }
}

 

  简:
尽或者保持完全陈设的简洁, 方法完毕的简要, 要依据情状使用内部存款和储蓄器缓存,
redis 缓存, jmq 异步处理。 那里的简供给把握好分寸。

(15) $pop  删除最终八个值:{ $pop : {
田野同志 : 1 } }删除第③个值:{ $pop : { 田野 : -1 }
}注意,只可以删除一个值,也正是说只可以用1或-1,而不可能用2或-2来删除两条。mongodb
1.1及今后的版本才能够用

依轮线日简,

 

     

(9)
$inc  对二个数字字段田野同志扩充value

     

(5) $ne  != (不等于) 

  接偶正分壮 – 洁偶正粉妆

  接:接口是用来隔开变化的,假设二个业务有二种不一样的模样,但都有一致的拍卖,那么能够定义接口来隔离业务形态的两样,在劳务调用处,通过工作类型字段来拿到不一样的服务类。
 而毫无达成二个类,然后在类的次第艺术中都基于业务品种做if
else或更扑朔迷离的各样判断。

优秀示例:

  做法1:

public interface BarService {    void doBarThing(Bar b);
    
    void doBarFatherThing(Bar b);
}
public class BarServiceImpl  implement BarService{
    public void doBarThing(Bar b) {
        if (b.getType() == BarType.A) {
            //do some logic
        } else (b.getType() == BarType.B) {
            //do some B type logic
        }
        //do other doBarThing logic
    }
    
    public void doBarFatherThing(Bar b) {
        if (b.getType() == BarType.A) {
            //do some logic
        } else (b.getType() == BarType.B) {
            //do some B type logic
        }
        //do other doBarFatherThing logic
    }
}

 

做法 2 :

public interface BarService {
    void doBarThing(Bar b);
    
    void doBarFatherThing(Bar b);
}
public class BarServiceFactory {
    public BarService getBarService(BarType type) {
        // get bar service logic
    }
}
//如果有公共逻辑就定义, 没有就不定义
public class BaseBarService implement BarService {
    public void doBarThing(Bar b) {
        //do other doBarThing logic
    }
    
    public void doBarFatherThing(Bar b) {
        //do other doBarFatherThing logic
    }
    
}
public class TypeABarService extends BaseBarService  implement BarService {
    public void doBarThing(Bar b) {
        // doATypeThing
        super.doBarThing(b);
    }
    
    public void doBarFatherThing(Bar b) {
        // do bar type A service
super.doBarFatherThing(b); //如果需要就调用, 不需要就不调用父类
    }
    
}

 

 
做法2的裨益是将不相同门类的逻辑解耦,各自发展,不会互相影响,若是添加类型也不用影响现有项目逻辑。

 

  偶:认识系统之间的耦合关系,通过联合数据来做七个体系里头的相互是一种很强的耦合关系,会使数码接收方依赖于数据发送方的数据库定义,倘使发送方想改数据结构,必须须要下游接收方一起修改;通过接口调用是一种常见的系列耦合关系,接口的提供方要保险接口的可用性,接口的调用方要考虑接口不可用时的回应方案;
mq音讯是一种解耦的格局,四个系统不存在实时的耦合关系。然而mq解耦的方法无法滥用,在平等系统内不宜过多使用mq音讯来做异步,要硬着头皮确认保证接口的性

  能,而不是经过mq幸免出标题后再度消费。

 

  正:模块之间重视关系要正向信赖,不能够让底层模块重视于上层模块;不可能让数据层注重于服务层也不能让服务层正视于UI层;也无法在模块之间形成巡回注重关系。

 

  分:分而治之,复杂的题材要分解成多少个相对不难的标题来消除,首先要分析出中央难点,然后分析出中央的入参是何等,结果是何等,入参通过几步变化能够汲取结果。

 

  壮:时刻注意程序的健壮性,从底下八个地点履行升高健壮性:

 
1)契约,在设计接口时定义好探讨参数,并在落实时第近期间校验参数,借使参数有标题,直接回到给调用方;
借使出现万分情形, 也按很是景况约定应对策略

2)  考虑各个边界条件的输出, 比如运单号查询服务,
要考虑用户输入错误运单时怎么重临, 有境界的询问条件,
假如用户查询条件超越界限了, 应该回到什么

  3   )为破产做设计,假设出难题了有降级应对方案。

  首先,感激cnblogs
TV,谢谢博主的TV,更谢谢对上期分享帮助的情侣们。在你们的援救,才有了让自个儿写下这一期的重力。夜晚或许你在TV边看TV,可能你在网上看电影。而笔者在服从了一天的总计机之后,继续坐到了总括机边,听着首都广播网的87.6,写着技术分享。好了第2来了,也是very
important.接着说小编们的mongodb吧

言欢空月虫,

也正是说比如,大家只想查某一条特定数据的详细音信的话,大家就足以用findOne();

       

(18) $
操作符  是她协调的情趣,代表按规则找出的数组里面某项他协调。那个比较坳口,就不说了。

依伦先日贱,

操作符相信大家一定都清楚了,便是等于、大于、小于、不等于、大于等于、小于等于,不过在mongodb里不能够直接行使那些操作符。在mongodb里的操作符是那般表示的:

贾言

架构师说, 用二十个字描述代码评定审查的剧情, 自省也省人。由于是一字一含义,
不连贯, 为了提升趣味性, 每句都增多对应的歪解。只是对广大评定审查的描述,
不尽之处,欢迎补充!

db.collection.find().sort({age:1}); //按照age正序排列
db.collection.find().sort({age:-1}); //按照age倒序排列
db.collection.count();   //得到数据总数
db.collection.limit(1);   //取数据的开始位置
db.collection.skip(10);  //取数据的结束位置
//这样我们就实现了一个取10条数据,并排序的操作。

       

那正是说作者想大家那时候一定会想到自己想对这七个列表排序呢,no
problem mongodb会为您潜心服务

       

 

接偶正分壮。

(2)
$lt  < (小于)   

洁偶正粉妆。

db.collection->insert({'name' => 'caleng', 'email' => 'admin#admin.com'});

验幻空越重,

db.collection.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } ); 只更新了第一条大于1记录
db.collection.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true ); 大于3的记录 全更新了
db.collection.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );  大于4的记录 只加进去了第一条
db.collection.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true ); 大于5的记录 全加进去

       

db.collection.remove({"name",'jerry'}) //删除特定数据
db.collection.drop() //删除集合内的所有数据

 

db.collection.find(array('name' => 'bailing'), array('email'=>'email@qq.com'))
db.collection.findOne(array('name' => 'bailing'), array('email''email@qq.com'))

(10) $set  就是一对一于sql的set 田野同志 =
value

喔!一口气写太多了,大家看太多也不错消化。明日就到那边吧,明日跟着写php对mongodb的操作,尽请期待啊!不能够再写了,不然的话前日会变熊猫。good
night. have a good dream.

(3) $gte  >= (大于等于)

查询

一、操作符

(17)
$pullAll  同$pull,能够2次删除数组内的八个值

是还是不是灰常简单呀,对正是这么简单,它从未字段的范围,你能够自由起名,并插入数据

二、CURD 增、改、读、删

(12)
$push  把value追加到田野(field)里面去,田野(field)一定借使数组类型才行,假使田野不设有,会激增三个数组类型加进去

(14)
$addToSet  增添四个值到数组内,而且唯有当这一个值不在数组内才扩充。

findOne()只回去2个文书档案对象,find()再次来到八个会晤列表。

distinct操作

(13)
$pushAll  同$push,只是3次能够追加五个值到3个数组字段内

 

(11) $unset  正是剔除字段  

增加

(16)
$pull  从数组田野内去除二个对等value值

db.user.distinct('name', {'age': {$lt : 20}})

 

(7)
$nin  not in (不包含)  

(6) $in  in
(包含)      

(8)
$exists  exist (字段是或不是留存) 

 

mongodb也能做mysql、sqlserver能做的大约拥有作用。

 

世家能够看看查询本身用了三种不相同的写法,这是干什么,其实那跟做菜是相同的,放不一样的调味品,炒出的菜是差别的寓意。上边给大家说一下,那两种佐料的例外功用。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图