首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java代码评审歪诗!让你写出更加优秀的代码!

重-虫 不要写重复代码,重复代码要使用重构工具提取重构。...-勋 不要在循环中调用服务,不要在循环中做数据库等跨网络操作; 频-品 写每一个方法时都要知道这个方法的调用频率,一天多少,一分多少,一秒多少,峰值可能达到多少,调用频率高的一定要考虑性能指标,考虑是否会打垮数据库...,是否击穿缓存; 异-宜 异常处理是程序员最基本的素质,不要处处捕获异常,对于捕获了只写日志,没有任何处理的catch要问一问自己,这样吃掉异常,是否合理; 下面是一个反例, 导出文件的controller...方法中做了两层的try...catch, catch块中记录日志后什么都没做, 这样用户看不到真正想要的内容, 研发也只有看日志才能发现错误, 而“看日志”, 通常只有业务方反馈问题时才会看, 就会导致研发人员发现错误会比现场人员还会晚...日-日 打印日志和设定合理的日志级别,如有必要要添加if条件限定是否打印日志,日志中使用JSON序列化,生成长字符串的toString()都要做if限定打印,否则配置的日志级别没达到,也会做大量字符串拼接

5.4K20

iOS property的多线程问题解析

的环境下,而OC实现ARC就是编译时添加retain和release的方法。...2同时运行objc_storeStrong,他们会同时拿到oldValue,此时retainCount都为1;当2个线程执行完赋值操作,都会对oldValue进行release操作,此时就会触发对象的重复...NSArray的多线程问题 有一个经典问题:NSArray是否为线程安全类,能否用atomic修饰NSArray属性保证属性的读写线程安全?...我们能保证NSArray类的线程安全,但是无法保证NSArray内的属性操作是线程安全,所以使用NSArray时,仍需要小心多线程问题。 思考题?: 为什么题目3可以正常运行?...附录 Thread Safety Summary objc_storeStrong objc_setProperty_atomic 一次标签指针(Tagged Pointer)导致的事故

1.1K21
您找到你想要的搜索结果了吗?
是的
没有找到

关于“Python”的核心知识点整理大全6

为此,我们可以分 别获取名单中的每个名字,但这种做法会导致多个问题。例如,如果名单很长,将包含大量重复 的代码。另外,每当名单的长度发生变化时,都必须修改代码。...4.1.2 for 循环中执行更多的操作 for循环中,可对每个元素执行任何操作。下面来扩展前面的示例,对于每位魔术师,都 打印一条消息,指出他的表演太精彩了。...for循环后面,没有缩进的代码都只执行一次,而不会重复执行。下面来打印一条向全体 魔术师致谢的消息,感谢他们的精彩表演。...例如,你可能使用for 环来初始化游戏——遍历角色列表,将每个角色都显示到屏幕上;再在循环后面添加一个不缩进 的代码块,屏幕上绘制所有角色后显示一个Play Now按钮。...试图环中执行多项任 务,却忘记缩进其中的一些代码行时,就会出现这种情况。

9310

京东资深架构师代码评审歪诗

在此之前和讯网负责股票基金行情系统的研发工作,具备高并发、高可用互联网应用研发经验。 贾言验幻空越重, 命频异长。 依轮线日简, 接偶正分壮。言欢空月虫, 明勋品宜昌。...,重复代码要使用重构工具提取重构 命频异长 - 明勋品宜昌 命: 包 / 类 / 方法 / 字段 / 变量 / 常量的命名要遵循规范,要名副其实, 这不但可以增加可读性,还可以起名的过程中引导我们思考方法...: 不要在循环中调用服务,不要在循环中做数据库等跨网络操作 频: 写每一个方法时都要知道这个方法的调用频率,一天多少,一分多少,一秒多少,峰值可能达到多少,调用频率高的一定要考虑性能指标,...考虑是否会打垮数据库,是否击穿缓存 异: 异常处理是程序员最基本的素质,不要处处捕获异常,对于捕获了只写日志,没有任何处理的 catch 要问一问自己,这样吃掉异常,是否合理 下面是一个反例, 导出文件的..., 就会导致研发人员发现错误会比现场人员还会晚。

4.7K30

iOS - 关于 KVC 的一些总结

如果集合中有非集合元素,导致Crash。 使用嵌套运算符时,如果有任何操作的对象为nil, 则valueForKeyPath:方法将引发异常。...添加一个分类,并定义一个_medianForKeyPath:方法,用来获取NSArray中的中位数。...非对象值处理 KVC支持基础数据类型和结构体,使用KVC进行赋值或取值的时候,自动非对象值和对象值之间进行转换。...注意: 此步骤中描述的机制比上一步的效率低得多,因为它可能重复创建新的集合对象,而不是修改现有的集合对象。因此,设计自己的键值编码兼容对象时,通常应该避免使用它。...相关面试题 Q:通过 KVC 修改属性触发 KVO ,通过KVC修改成员变量值也触发KVO。 Q:通过 KVC 键值编码技术是否破坏面向对象的编程方法,或者说违背面向对象的编程思想呢?

1.8K10

负载均衡调度算法大全

基于这个前提,轮调度是一个简单而有效的分配请求的方式。然而对于服务器不同的情况,选择这种方式就意味着能力比较弱的服务器也会在下一轮循环中接受轮,即使这个服务器已经不能再处理当前这个请求了。...这可能导致能力较弱的服务器超载。 ?...这意味着服务器B接收到第一个请求之前前,服务器A连续的接受到2个请求,以此类推。...值得注意的是,流量率低的配置环境中,各服务器的流量并不是相同的,优先考虑第一台服务器。...然而,流量非常低的环境下,服务器报上来的负载值将不能建立一个有代表性的样本;那么基于这些值来分配负载的话将导致失控以及指令震荡。因此,在这种情况下更合理的做法是基于静态的权重比来计算负载分配。

6.3K30

词典对象 NSDictionary与NSMutableDictionary

Objective-C语言中,当然也有这方面的支持,词典对象就是做这个事情的,不过同一个词典对象中可以保存多个不同类型的数据,不像Java与C只能保存声明的相同类型的数据,这一点还是可以解决不少问题的...,动态的添加数据如果超过10这个词典长度自动增加,所以不用担心数组越界。 [NSMutableDictionary initWithCapacity:10]  :只是初始化一个词典的长度为10。...迭代的变量每次循环中为声明的对象设置 。当循环结束时,迭代的变量被设为 nil 。要是循环提前结束,那么迭代变量被遗弃,指向最后迭代的对象。... Foundation 框架中的集合类—NSArray, NSDictionary 以及 NSSet—就采用了这个协议,就像 NSEnumerator....很显然, NSArray 和 NSSet 中,枚举是针对它们的内容。对于其它的类,响应的文档应当明确哪个属性是用来迭代的。

1.2K70

iOS开发:NSSet的使用

前言 iOS开发过程中,有些时候会用到去重处理,也就是去掉重复的元素或者个数,然后再进行排序处理,这就使用到了集合(NSSet),它其实是一种哈希表,通过运用散列算法来查找集合中的元素。...集合和数组的相同点:都是存储不同元素的地址,不同点:NSSet中的元素都是被自动过滤之后的不会重复的元素,NSArray中的元素却是允许重复的;NSSet是一个无顺序的集合,NSArray是一个有顺序的集合...相对来说,NSSet的处理效率比NSArray的要快。 本节内容就来简单的介绍一下NSSet的使用,并且举一个实际使用案例来展示。...一、基本常用的方法 (一)NSSet 1、集合初始化: NSSet初始化的时候,赋值的时候如果放入两个相同元素的话,自动删除其中一个相同的元素。...[mSet1 addObject:@“5”]; [mSet1 addObject:@“6”]; [mSet1 addObject:@“6”]; //如果添加的元素有重复,实际情况只保留一个相同的元素

1.5K64

常见负载均衡策略「建议收藏」

基于这个前提,轮调度是一个简单而有效的分配请求的方式。然而对于服务器不同的情况,选择这种方式就意味着能力比较弱的服务器也会在下一轮循环中接受轮,即使这个服务器已经不能再处理当前这个请求了。...这可能导致能力较弱的服务器超载。...这意味着服务器 B 接收到第一个请求之前,服务器 A 连续的接收到 2 个请求,以此类推。...值得注意的是,流量率低的配置环境中,各服务器的流量并不是相同的,优先考虑第一台服务器。...然而,流量非常低的环境下,服务器报上来的负载值将不能建立一个有代表性的样本;那么基于这些值来分配负载的话将导致失控以及指令震荡。 因此,在这种情况下更合理的做法是基于静态的权重比来计算负载分配。

6.6K30

Method-Swizzling 方法交换

bIMP, bIMP -> aIMP 坑点1:method-swizzling使用过程中的一次性问题 所谓的一次性就是:mehod-swizzling写在load方法中,而load方法会主动调用多次,这样导致方法的重复交换...// 交换自己没有实现的方法: // 首先第一步:先尝试给自己添加要交换的方法 :personInstanceMethod (SEL) -> swiMethod(IMP)...imp中 method-swizzling的应用 method-swizzling最常用的应用是防止数组、字典等越界崩溃 iOS中NSNumber、NSArray、NSDictionary等这些类都是类簇...这样导致方法交换无效 + (void)load{ Method fromMethod = class_getInstanceMethod(objc_getClass("__NSArrayI")...这样导致方法交换无效 - (id)cjl_objectAtIndex:(NSUInteger)index{ //判断下标是否越界,如果越界就进入异常拦截 if (self.count-

59540

iOS开发·runtime原理与实践: 方法交换篇(Method Swizzling)(iOS“黑魔法”,埋点统计,禁止UI控件连续点击,防奔溃处理)

用法 先给要替换的方法的类添加一个Category,然后Category中的+(void)load方法中添加Method Swizzling方法,我们用来替换的方法也写在这个Category中。...方案 给按钮添加分类,并添加一个点击事件间隔的属性,执行点击事件的时候判断一下是否时间到了,如果时间不到,那么拦截点击事件。 怎么拦截点击事件呢?...类簇 iOS中NSNumber、NSArray、NSDictionary等这些类都是类簇(Class Clusters),一个NSArray的实现可能由多个类组成。...抽象工厂内部有很多其它继承自当前类的子类,抽象工厂类根据不同情况,创建不同的抽象对象来进行使用。...所以如果我们对NSArray类进行Swizzling操作其实只是对父类进行了操作,NSArray内部会创建其他子类来执行操作,真正执行Swizzling操作的并不是NSArray自身,所以我们应该对其

2.5K60

OC学习13——Foundation框架中的集合

NSArray代表有序可重复的集合;NSSet代表无序不可重复的集合;NSDictionary代表具有映射关系的集合。显然,这三类集合分别对应这Java中的List、Set和Map。   ...一、数组(NSArray与NSMutableArray) 1、NSArray代表元素有序、可重复的一个集合,集合中每个元素都有其对应的顺序索引。...NSArray集合允许使用重复元素,可以通过索引来访问指定位置的集合元素。...来创建NSArray   参考NSArray类的文档,可以看到NSArray集合的方法大致包含如下几类: 查询集合元素NSArray中的索引,即下标 根据索引值取出NSArray集合中的元素 对集合元素整体调用方法...NSMutableOrderedSetNSOrderedSet的基础上增加了添加元素、删除元素、替换元素、集合排序,以及计算集合的交、并、差等功能。

2K80

iOS 开发:『Crash 防护系统』(二)KVO 防护

重复移除多次,移除次数多于添加次数,导致崩溃。 重复添加多次,虽然不会崩溃,但是发生改变时,也同时会被观察多次。 被观察者提前被释放,被观察者 dealloc 时仍然注册着 KVO,导致崩溃。...添加观察者时:通过关系哈希表判断是否重复添加,只添加一次。 移除观察者时:通过关系哈希表是否已经进行过移除操作,避免多次移除。...[self testKVOCrash11]; // 1.2 重复移除多次,移除次数多于添加次数,导致崩溃 // [self testKVOCrash12]; // 1.3...重复添加多次,虽然不会崩溃,但是发生改变时,也同时会被观察多次。...[self.objc removeObserver:self forKeyPath:@"name"]; } /** 1.2 重复移除多次,移除次数多于添加次数,导致崩溃 */ - (void)testKVOCrash12

4.2K41

如何优雅地检测内存泄漏?

检测全局对象引用耗时较高(约2-3s),子线程进行 @property(nonatomic, assign) BOOL checkGlobalRetain; /// 添加自定义的全局对象,默认为`nil...; /// 添加白名单类名 - (void)addClassNamesToWhiteList:(NSArray *)classNames; /// 添加白名单对象。...iOS开发中最常遇到的内存泄漏类型有: 存在循环引用,导致对象无法释放 被全局对象(如单例)持有,导致对象无法释放 (非ARC管理的对象)没有主动释放 本文主要介绍前两种内存泄漏的检测,第三种内存泄漏问题不在本文的讨论范围内...如果不借助其他工具,我们只能 对着相关代码一行行看 重复出问题的场景, Xcode 的 Memory Graph 中定位该对象。 显然,这两种方案都不够优雅,费时费力,还不一定能找到问题。...等等,这不是和 FBRetainCycleDetector 的检测机制差不多?有没有办法复用 FBRetainCycleDetector 的检测逻辑呢? 好像不行,因为此时并没有出现循环引用?

1.5K10

【Java】循环语句for、while、do-while

循环语句 1.1 循环概述 循环语句可以满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环 体语句,当反复执行这个循环体时,需要在合适的时候把循环判断条件修改为false...,从而结束 环,否则循环将一直执行下去,形成死循环。...具体执行的语句 ④循环后,循环变量的变化情况 输出10次HelloWorld do...while 循环的特点:无条件执行一次循环体,即使我们将循环条件直接写成 false ,也依然...1.6 跳出语句 break 使用场景:终止 switch 或者循环 选择结构 switch 语句中 循环语句中 离开使用场景的存在是没有意义的 continue 使用场景...扩展知识点 2.1 死循环 死循环: 也就是循环中的条件永远为 true ,死循环的是永不结束的循环。例如: while(true){} 。

6.7K10

【ES】199-深入理解es6块级作用域的使用

,如下例: var name = 'eveningwater'; //错误,不能重复声明 const name = 'loho'; 但也可以不同作用域中重复声明,如下例: var name = 'eveningwater...如下: for(let i = 0;i < 100;i++){ //执行某些操作 } //报错 console.log(i); 6.循环中的创建函数 使用var声明变量的循环中,创建一个函数非常的困难...由于函数有自己的作用域,因此向数组中添加函数的时候,实际上循环已经运行完成,因此每次打印变量i的值都相当于是全局中访问变量i的值,即i = 5这个值,因此实际上答案最终会返回5次5....es5中,我们可以使用函数表达式(IIFE)来解决这个问题,因为函数表达式创建一个自己的块级作用域。...for-of循环是es6的新增的坏。。 7.全局作用域绑定 let,const声明与var声明还有一个区别就是三者全局作用域中的行为。

3.7K10

Android为什么不能在子线程更新UI

为什么还需要开启消息坏 使用子线程更新UI有实际应用场景 Android为什么不能在子线程更新UI? // Android中为什么子线程不能更新UI?...由于网络延时或者大量耗时操作,会使UI绘制错乱,出了问题也很难去排查到底是哪个线程更新时出了问题; 主线程负责更新,子线程负责耗时操作,能够大大提高响应效率 UI线程非安全线程,多线程进行并发访问有可能导致内存溢出...ViewRootImp是onActivityCreated方法后面创建的 // ViewRootImp是onActivityCreated方法后面创建的?...一是加锁让UI访问变得复杂; 二是加锁降低UI访问效率,阻塞一些线程访问UI。...为什么还需要开启消息坏 // 保证上述条件1成立,不就可以避免checkThread时候抛出异常了吗?为什么还需要开启消息坏?

1.4K20
领券