精华内容
下载资源
问答
  • 由AOP引发的几点思考

    2019-03-31 16:54:28
    毕业面试那会儿,被问最多问题便是:请你解释一下什么是AOP思想。当时最喜欢回答方式是先将英文全称给呈现出来“威慑”下面试官,即...最近项目中用到了AOP,想把个思考总结一下。 讲AOP之前,首先先回...

    毕业面试那会儿,被问最多的问题便是:请你解释一下什么是AOP思想。当时最喜欢的回答方式是先将英文全称给呈现出来“威慑”下面试官,即——Aspect Oriented Programming。然后把网上搜集的各种解释,使用场景理直气壮地背一遍。这样的回答能唬住一些对应届生要求不高的面试官,但真遇上爱刨根问底的大佬就该GG了。最近在项目中用到了AOP,想把几个思考点总结一下。
    在讲AOP之前,首先先回顾一下POP——Process Oriented Programming以及OOP——Object Oriented Programming

    • POP与OOP

      • 对于一个问题,给出解决问题的所需的步骤,POP是一种以功能实现为导向的编程思想,换句话说:功能性的目标实现了就行。然而OOP注重封装,强调实现过程中的模块化,对象化,将对象内部的属性和外部分开。用大家租房时可能遇到的户型来说,POP偏向于"开放式房型",布局中有床,灶台,浴缸,沙发等各类功能的事物。作为一个整体提供人们住房的实现。而OOP偏向于传统的户型,卫生间,厨房,卧室,客厅等具体事物之间有门隔开,作为整体起到“房子”该有的功能和效果,但彼此之间又相对独立,具有较低的耦合性。这样的房子也能正常居住。
      • POP的设计,节约了空间成本(无需“门”的设计),这种设计在早期计算机配置低,内存小的情况下,是一种以时间换空间的良好设计。但这种设计的房子使得各个事物时间相互暴露互相串味,整理布局来看,也显得有些杂乱无章。OOP的户型则提供了更加优雅的设计,使得各个事物都有自己“该待”的地方(类的概念)。不同的类之间无需知道对方的细节,是需提供彼此之间自身的功能和属性(方法调用等)即可,各类各司其职,达到整体上服务租客的效果。
      • 当然不能因为我是一名Java开发而肯定OOP思想的同时否认POP思想,两种思想都是不同的时期人类思考的产物,OOP和POP相对来说是整体和局部的概念,这也是从方法论的角度来看待两者。POP之间互相暴露的功能实现就像OOP实现中某个类,同类属性和方法是有相互了解的权利的。
      • 由OOP编程思想主导的项目里,充斥着众多相互依赖同时相互隔离的对象,将一些数据(属性)和算法(方法)封装在类里面,使得系统更加安全,也更便于后期修改维护。但随着系统的复杂性的增强,应用会进行相应的升级。OOP设计思想也逐渐开始暴露弊端。
    • 场景一

      • 背景A:ClassA,ClassB以及ClassC,有各自需实现的业务方法。
    /**
     * @Author: Rebecca in Shanghai.
     * @Date: 2019/3/30 22:40
     */
    public class ClassA {
    
        public void doSomethingInA(){
            // Biz code omitted here.
        }
    }
    
    /**
     * @Author: Rebecca in Shanghai.
     * @Date: 2019/3/30 22:41
     */
    public class ClassB {
    
        public void doSomethingInB(){
             // Biz code omitted here.
    
        }
    
        private void checkIfLogIn() {
    
        }
    }
    
    /**
     * @Author: Rebecca in Shanghai.
     * @Date: 2019/3/30 22:41
     */
    public class ClassC {
    
        public void doSomethingInC(){
            // Biz code omitted here.
        }
    
    }
    
    • 背景B: 各个类的各个方法执行前需增加“用户是否登录”的权限校验功能。
      • A猿灵机一动。给每一个类的每一个方法原代码之前加入了如下的判断。
    /**
     * @Author: Rebecca in Shanghai.
     * @Date: 2019/3/30 22:40
     */
    public class ClassA {
        
        private  User user;
    
        public void doSomethingInA(){
            if (!user.isStatus()){
                return;
            }
             // Biz code omitted here.
        }
    }
    
    • 背景B: 各个类的各个方法执行前需增加“用户是否登录”的权限校验功能。
      • B猿一阵嘲笑:呵呵,这不是侵入原代码了么?要是再来几个其他的功能入侵怎么办。下面是他的修改方案。将原“非法入侵”部分抽离成另一个私有方法进行调用。其他几个类的方法也进行了同样的处理。
    /**
     * @Author: Rebecca in Shanghai.
     * @Date: 2019/3/30 22:40
     */
    public class ClassA {
    
        private  User user;
    
        public void doSomethingInA(){
            
            checkIfLogIn();
             // Biz code omitted here.
        }
    
        private void checkIfLogIn() {
            if (user.isStatus()){
                return;
            }
        }
    }
    
    • 背景B: 各个类的各个方法执行前需增加“用户是否登录”的权限校验功能。
      • C猿看了摇摇头,心想:从整体来看,这三个类中被抽离出来的方法实现的功能不是一样的么?这对于整个系统来说不还是冗余代码么?于是他有了以下的改方案。利用AOP切面,在需进行用户登录校验的方法上加相应的注解,在不侵入原业务代码的同时也能实现较大程度的代码复用。这样的实现,代码的扩展性,可维护性也更强。
     /**
     * @Author: Rebecca in Shanghai.
     * @Date: 2019/3/30 22:40
     */
    public class ClassA {
    
        private  User user;
    
        @CheckLogInListener
        public void doSomethingInA(){
             // Biz code omitted here.
        }
    }
    
    /**
     * @Author: Rebecca in Shanghai.
     * @Date: 2019/3/30 23:04
     */
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface CheckLogInListener {
        String name() default "";
    }
    
    /**
     * @Author: Rebecca in Shanghai.
     * @Date: 2019/3/30 23:09
     */
    @Aspect
    @Component
    @Slf4j
    public class CheckLogInHandler {
        private static final String EXECUTION="@annotation(checkLogInListener)";
    
        @Before(EXECUTION)
        public void checkIfLogIn(CheckLogInListenercheckLogInListener) {
            // checkIfLogIn code omitted here.
        }
    }
    
    • 背景C: 各个类的各个方法执行前去掉“用户是否登录”的权限校验功能,并加上方法前后的日志打印以及业务异常失败重试功能。并要求日志打印的功能执行顺序在也是失败重试功能之前。
      • 聪明的A猿听了背景B下C猿的解法后恍然大悟,刷刷刷给出了下面的解法。
     /**
     * @Author: Rebecca in Shanghai.
     * @Date: 2019/3/30 16:30
     */
    @Service
    public class AopTestService {
    
        @RetryListener(retryForException = Exception.class)
        @LogListener(logLevel = "info")
        public String testForAopOrder(MyInfo myInfo) {
        
            return myInfo.toString();
            
        }
    }
    
    /**
     * @Author: Rebecca in Shanghai.
     * @Date: 2019/3/29 22:11
     */
    @Target(ElementType.METHOD)
    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    public @interface LogListener {
    
        String logLevel() default "";
    
    }
    
    /**
     * @Author: Rebecca in Shanghai.
     * @Date: 2019/3/29 22:14
     */
    
    @Slf4j
    @Aspect
    @Component
    public class LogHandler {
    
        private static final String EXECUTION = "@annotation(logListener)";
    
        @Around(EXECUTION)
        public void doAround(ProceedingJoinPoint point, LogListener logListener) {
            log.info("LOG-begins. Args={}, logLevel={}", point.getArgs(), logListener.logLevel());
            try {
                Object returnObj = point.proceed();
                log.info("LOG-ends. ReturnObj={}", returnObj);
            } catch (Throwable throwable) {
                log.error("Log-ends with error,error={}", throwable);
            }
        }
    }
    /**
     * @Author: Rebecca in Shanghai.
     * @Date: 2019/3/30 16:17
     */
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface RetryListener {
    
        Class<?>[] retryForException();
    
        Class<?>[] noRetryForException() default Exception.class;
    }
    
    /**
     * @Author: Rebecca in Shanghai.
     * @Date: 2019/3/30 16:28
     */
    @Slf4j
    @Aspect
    @Component
    public class RetryHandler {
        private static final String EXECUTION = "@annotation(retryListener)";
    
        @Around(EXECUTION)
        public void doAround(ProceedingJoinPoint point, RetryListener retryListener) {
            log.info("Retry-begins. Args={}, retryForExceptions={}", point.getArgs(), retryListener.retryForException());
            try {
                Object returnObj = point.proceed();
                log.info("Retry-ends. ReturnObj={}", returnObj);
            } catch (Throwable throwable) {
                log.error("Retry-ends with error,error={}", throwable);
            }
        }
    }
    
    • 背景C: 各个类的各个方法执行前去掉“用户是否登录”的权限校验功能,并加上方法前后的日志打印以及业务失败重试功能。并要求日志打印的功能执行顺序在也是失败重试功能之前。
      • 请求后的结果是:
        在这里插入图片描述
    • 背景C: 各个类的各个方法执行前去掉“用户是否登录”的权限校验功能,并加上方法前后的日志打印以及业务失败重试功能。并要求日志打印的功能执行顺序在也是失败重试功能之前。
      • 看到希望的执行结果,A猿沾沾自喜,但B猿却提出了A猿的解法有投机取巧的嫌疑:虽然此解法得到了想要的结果,但并没有指定具体的Aspect之间的执行顺序。B猿接过代码,在两个Aspect上分别加上了@Order注解。并给出了解释:@Order中的数字代表优先级,数字越小,优先级越高(越先执行)。
    /**
     * @Author: Rebecca in Shanghai.
     * @Date: 2019/3/29 22:14
     */
    @Order(0)
    @Slf4j
    @Aspect
    @Component
    public class LogHandler {
    
        private static final String EXECUTION = "@annotation(logListener)";
    
        @Around(EXECUTION)
        public void doAround(ProceedingJoinPoint point, LogListener logListener) {
            log.info("LOG-begins. Args={}, logLevel={}", point.getArgs(), logListener.logLevel());
            try {
                Object returnObj = point.proceed();
                log.info("LOG-ends. ReturnObj={}", returnObj);
            } catch (Throwable throwable) {
                log.error("Log-ends with error,error={}", throwable);
            }
        }
    }
    
    /**
     * @Author: Rebecca in Shanghai.
     * @Date: 2019/3/30 16:28
     */
    @Order(1)
    @Slf4j
    @Aspect
    @Component
    public class RetryHandler {
        private static final String EXECUTION = "@annotation(retryListener)";
    
        @Around(EXECUTION)
        public void doAround(ProceedingJoinPoint point, RetryListener retryListener) {
            log.info("Retry-begins. Args={}, retryForExceptions={}", point.getArgs(), retryListener.retryForException());
            try {
                Object returnObj = point.proceed();
                log.info("Retry-ends. ReturnObj={}", returnObj);
            } catch (Throwable throwable) {
                log.error("Retry-ends with error,error={}", throwable);
            }
        }
    }
    
    • 背景C: 各个类的各个方法执行前去掉“用户是否登录”的权限校验功能,并加上方法前后的日志打印以及业务失败重试功能。并要求日志打印的功能执行顺序在也是失败重试功能之前。
      • 那么为什么在不指定Order的情况下,A猿的实验结果也是“正确”的呢?C猿通过阅读源码给出了下面的解释:
        • 首先,不指定Order的情况下,所有的Aspect的优先级都是最低的(lowest precedence)
        • 在不指定Order的情况下,Aspect的执行顺序遵从目标对象在容器中的注册顺序有关。
        • 这也就表明了面向切面编程的“不可控性”,当同一套代码部署PROD环境中,如果不指定Order,可能会出现与DEV环境不同的执行顺序,导致不可预料的效果。之前在Spring.doc文档中看过作者形容不指定Order时,不同的Aspect执行的顺序,印象很深的一个词是“Arbitrary”,即Aspect的执行顺序是随意的,不同的jvm对于执行顺序都有其随机算法。不知道这样理解对不对。但希望今后大家在使用AOP编程时能使用有效的方法控制切入代码和原有代码的执行顺序,否则后患无穷。
          在这里插入图片描述
          在这里插入图片描述
    展开全文
  • 学长昨晚跟我说“十一回来以后,就要开始看论文了吧”。的确,研究生学术任务就是发论文呀。现在不开始看,更待何时呢? 写论文之前得先看论文。...基本都是英文的,上面还标出了“一作”、“通信作者”...

    学长昨晚跟我说“十一回来以后,就要开始看论文了吧”。的确,研究生的学术任务就是发论文呀。现在不开始看,更待何时呢?
    写论文之前得先看论文。可是“看论文”听起来简单,真要做起来,还真是一头雾水。
    关于看论文,我就有好多问题……
    第一个问题就是——该看什么论文呢?
    应该看研究方向相关的吧~
    我导师在官网上的个人介绍部分,关于学术成果,就列出了很多论文。基本都是英文的,上面还标出了“一作”、“通信作者”这些。之前还看有的人的论文后面标出了“影响因子”,还有什么A类、B类,二区、三区……这都是什么意思呢?
    完全不懂,怎么办?没关系,发现问题是第一步~~
    于是,引出第二个问题——论文究竟是怎么一回事儿?
    (唉,论文小白只能从头开始慢慢探究了)
    各方向有自己认可的顶级会议期刊,计算机方向的就有好多,如果我想搞明白从写作到投稿再到发表这全部流程,除非是我自己亲身经历,否则是很难弄清楚的……
    在知乎上也看了好多相关问题和回答,感觉他们并没有回答我的疑问,
    反而让我产生了一大堆新的疑问,比如:怎么投稿呢?写好的文章发邮件就可以了吗?怎么知道这些期刊的征文消息呢?这个过程中需要交哪些费用呢?难道没有一本书是介绍这个的吗?……我哭……
    诶……旧问题还没解决,新问题又有一大堆,简直是间接劝退

    如果没有引路人,自己瞎摸索,真的是好难啊……
    从什么开始做起呢?
    我想还是因为我的输入不够。了解的还是不够,继续看资料吧,先充分地输入再说~


    就在我自己在试探过后,差点被劝退的时候
    学长给我发了一个压缩包,里面是组里发过的一些论文
    天了噜,简直不要太及时!o(╥﹏╥)o感谢!
    他告诉我要先积累
    论文看起来~
    于是我的新问题变成了怎么看论文。

    展开全文
  • 搜狗输入法时输入中文,提示下拉栏全是英文 ...之前搜狗中英文是没有问题,后来我需要打英文,而且能够打个字母就能显示很多单词可以选,我知道了可以右键中有个英文输入是灰色,只要...

    搜狗输入法时输入中文,提示下拉栏全是英文

     

    原因:

    是因为使用了美式键盘:

     

    状态是怎样的呢:

    解决办法:

       ctrl + shift +e 

     

    搜狗输入法是中文,打字显示却是英文?为什么?

    你好,大侠,百度了好多都找不到答案。之前搜狗中英文是没有问题的,后来我需要打英文,而且能够打几个字母就能显示很多单词可以选的,我知道了可以在右键中有个英文输入是灰色的,只要点了就可以了,之后问题来了,当我想打中文时,切换到中文时,打字出来...展开

    最佳答案

    说实话没太看懂你的意思。

    搜狗中文状态下,shift是切换到英文,这是搜狗的英文。

    你说的ctrl+空格是从中文输入法切换到美式键盘,美式键盘只能输入字母。

    两者没关系。

    搜狗有个智能英文,在搜狗中文状态下快捷键ctrl+shift+E可以切换。

    搜狗默认开机就是中文,你的搜狗经常自动变为英文?设置属性里的初始状态也改了吗?是不是按到shift了。

     

    展开全文
  • #python打卡##Python数学编程##python#近日,看python官网(英文网站)时,使用了有道翻译工具查看了个专有名词。...此时,突然间想起,之前很多人说看不懂python官网以及其他个重要的英文学习网...

    #python打卡##Python数学编程##python#

    567920b4b43ca57242f94182432c8c08.png
    2d848d20273040da36b38ed300fb5b00.png

    近日,在看python官网(英文网站)时,使用了有道翻译工具查看了几个专有名词。无意间,有了是不是可以输入网站地址进行翻译的想法,翻译后的网站地址点击进去后,又是一个什么情况呢?小编发现,经过有道翻译后的python官网地址,点开的链接网站,由英文转成了中文。

    此时,突然间想起,之前很多人说看不懂python官网以及其他几个重要的英文学习网站。想来发现的这个技巧多少可以帮助一些人,解决其不能查看英文网站的困惑。

    小编以python官网为例,看看如何实现将英文网站转成中文网站,让更多的人受益。接下来,小编将具体的步骤分享给大家。

    首先,我们打开python官网,复制网址链接。

    733bebb638f19ca97f1a77c653f4a2df.png

    其次,打开一个新页面,选择百度搜索,输入有道翻译,点击搜索后找到有道翻译网址,点击后输入我们复制的python官网地址。如下所示:

    522c0f02f44206ae836737d40cbd1502.png

    第三,我们直接点击翻译后的python官网地址,如上图蓝色地址,将会打开一个新页面,如下图所示:

    f9d255019a5683bc09422839c3bbac78.png

    大家可以看到,经过这样的操作,原来python官网中全英文的介绍,转成了中文。但是,这样翻译的结果,准确性未经过验证,所以在使用的过程中,大家不要完全依赖这种方式翻译后的结果,还是要对比原英文网站,以保证理解上不会有所偏差。

    小编在本文只是以python官网为例,大家可以使用其他英文网站进行实验,从此打开了新的学习之路。希望小编的这个方法的分享,能够帮助到大家,感谢支持!给个关注,支持一下!

    展开全文
  • 近日 ,看python官网(英文网站)时 ,使用了有道翻译工具查看了个专有名词 。无意间 ,有了是不是可以输入网站...此时 ,突然间想起 ,之前很多人说看不懂python官网以及其他个重要的英文学习网站 。想来发现...
  • 元件列表中单击要选择元件,相同元件可以一起选择(键盘上按住Ctr键+列表项,或Shift+鼠标+列表项) §3.12.2 选型: 选型按钮:进入元件库,选择好元件后,确定。进入元件库后,通常用元件过滤方式查找...
  • 登录三种实现方式

    千次阅读 2019-05-28 14:57:05
    我实习之前我就已经看单登录是什么了,但是实习时候一直忙其他事,所以有个网站就一直躺收藏夹里边: 前阵子有个读者来我这投稿,是使用JWT实现单登录(但是文章中并没有介绍什么是...
  • [XMLSpy]简介及几点使用注意事项

    千次阅读 2015-07-11 00:16:03
    问题描述:之前编程从数据库获取数据生成XML文档用于描述相关数据信息,由于材料整理需要现要对XML文档数据类型、结构等进行约束和...使用过程:安装之后首先得学习怎么使用,软件安装文件夹下有一个英文t
  • 近日,看python官网(英文网站)时,使用了有道翻译工具查看了个...此时,突然间想起,之前很多人说看不懂python官网以及其他个重要的英文学习网站。想来发现的这个技巧多少可以帮助一些人,解决其不能查看英文...
  • 英语基础不好能学编程吗?...编程当中,其实只要知道最基本的英语知识就可以了,重要的是要了解使用的英文单词有什么作用,比如简单的fornext循环,你可以不知道for和next是什么意思,但是你要知道这是一个循环,...
  • 之前一直做移动机器人定位算法。查来查去,发觉粒子滤波算法(又叫MC算法)应该算是最流行了。因此开始学习使用之。入手是本英文书叫“probalistic robotic” 很不错,我所见到讲得最好一本书。花了大量...
  • 我实习之前我就已经看单登录是什么了,但是实习时候一直忙其他事,所以有个网站就一直躺收藏夹里边: 收藏一些网站 前阵子有个读者来我这投稿,是使用JWT实现单登录(但是文章...
  • MEL脚本之前先说个注意,1 把maya环境改成英文的,虽说中文没问题,但是总觉得不习惯如果安装后是中文,要改成英文的x:\Program Files\Autodesk\Maya2014\resources\l10n 这个文件夹下面zh_CN 这个文件压缩...
  • 背景 雷达最早是二战时期英国,用于防御探测入侵本土德国飞机,最终阻挡了德国跨过英吉利...雷达基本功能是探测和定位,这一点从其英文缩写中就可以看出来,RADAR-Radio Detection And Ranging,意为无线电...
  • 最近卖了几个站,所以想写篇文章分享一下我是如何靠搭建英文站来达到月入上万元。本篇文章纯分享为主,希望能给大家...简要说说以下几点: 首先,安装google翻译插件,安装chrome浏览器。全程和老外用google翻译沟通。
  • 我实习之前我就已经看单登录是什么了,但是实习时候一直忙其他事,所以有个网站就一直躺收藏夹里边:收藏一些网站前阵子有个读者来我这投稿,是使用JWT实现单登录(但是文章中并没有...
  • 个月之前,打算写个简单加密用于项目,总算腾出时间。处理第一步字符串转二进制并反转时,以为有简单现成,结果国内看了看都不太好使(没找到),8位和16位同时处理总有点bug。前一天弄了个小时没弄好,...
  • 什么是单登录(SSO)

    2020-07-22 11:35:22
    我实习之前我就已经看单登录是什么了,但是实习时候一直忙其他事,所以有个网站就一直躺收藏夹里边: 收藏一些网站 前阵子有个读者来我这投稿,是使用JWT实现单登录(但是文章中...
  • ros环境下amcl配置笔记

    千次阅读 2018-05-17 02:43:38
    这段时间导师让研究一下amcl,之前只有一点ros基础,根本不知道amcl是什么东东,于是开始查资料找教程,但是真心没有找到面向小白配置教程,摸索中,终于让amcl正常跑起来了,所以,一定要做一下...
  • 我实习之前我就已经看单登录是什么了,但是实习时候一直忙其他事,所以有个网站就一直躺收藏夹里边: 收藏一些网站 前阵子有个读者来我这投稿,是使用JWT实现单登录(但是文章...
  • input其后能够跟变量列表,也就是能够将内容分别赋值给个变量,文本中用逗号分隔开,也就是说,文本中第一个逗号(英文半角逗号)之前的给变量列表里面的第一个变量,第一个逗号之后,第二个
  • 最近有好个人问线宽设置的问题,之前发过篇关于线宽的文章,但有些问题并没有讲清楚,觉得有必要重新整理一下。一、什么是线宽?设计图纸中用线的粗细来突出更重要的图形,CAD软件因此引入了线宽设置,线宽...
  • 使用瑞士军刀之前还要先培训如何使用水果刀?另外,水果刀上面粘一个剪刀、起子、锯子、锉刀、牙签、指南针、尺子、放大镜……我估计也不会太好用(不叫“瑞士军刀”,叫“超级武器霸王3000”)。 2.看...
  • 最近有好个人问线宽设置的问题,之前发过篇关于线宽的文章,但有些问题并没有讲清楚,觉得有必要重新整理一下。一、什么是线宽?设计图纸中用线的粗细来突出更重要的图形,CAD软件因此引入了线宽设置,线宽...
  • 这段时间因为工作需要,要熟悉UI层自动化测试工具,笔者对自动化测试在之前并无了解,但是一番了解下后发现现在关于web UI 最受欢迎莫过于Selenium了,当然RobotFramework也名列前茅,而参数化也是尤为重要...
  • 知乎用户"躺着不干活"对此书推荐(《介绍一本作者很话痨数学分析书》)让我很感兴趣,却只经管之家找到个10币资源,捏着鼻子下载了。。。 原文链接如下: https://zhuanlan.zhihu.com/p/50392827 为防链接失效...
  • 英文全称为Dot per inch,就是一英寸上显示的点,而这个并不是意义上像素。 一般来说,显示器是96DPI,也就是说96像素等于1 inch,但实际上不应该是这样,因为显示器分辨率可以调整。 96DPI可以...
  • 1分钟内能处理手工需小时才能完成的几万行ERP或KingDee原始数据。极力推荐工具之一。 【取唯一值】 能瞬间取任意存储格区域内容为不含重复值唯一值清单,加载到工具中并提供随时随地调用,具有重复加载与...
  • 心情糟糕,随便写

    2015-06-25 22:23:41
    本来还计划把之前的文献接着翻译一下的,结果晚上件事下来搞得心烦意乱,什么也做不进去。随便看了篇文章,发现这里的篇译文相当有营养,索性贴这有机会再看看。Joel on software 也是很有名的博客了吧,但是...

空空如也

空空如也

1 2 3 4 5 ... 17
收藏数 322
精华内容 128
关键字:

在几点之前的英文