您现在的位置是:主页 > news > php网站开发个人职责/seo接单平台

php网站开发个人职责/seo接单平台

admin2025/6/18 7:22:00news

简介php网站开发个人职责,seo接单平台,唐山专业做网站,qq登录网站授权怎么做面向对象编程练习本周,我们将重点介绍面向方面的编程 ,这是一种强大的编程技术: 在计算中, 面向方面的编程 (AOP)是一种编程范例,旨在通过允许跨领域关注点的分离来提高模块化。 通过在不修改代…

php网站开发个人职责,seo接单平台,唐山专业做网站,qq登录网站授权怎么做面向对象编程练习本周,我们将重点介绍面向方面的编程 ,这是一种强大的编程技术: 在计算中, 面向方面的编程 (AOP)是一种编程范例,旨在通过允许跨领域关注点的分离来提高模块化。 通过在不修改代…

面向对象编程练习

本周,我们将重点介绍面向方面的编程 ,这是一种强大的编程技术:

在计算中, 面向方面的编程 (AOP)是一种编程范例,旨在通过允许跨领域关注点的分离来提高模块化。 通过在不修改代码本身的情况下向现有代码添加其他行为(建议)来做到这一点,而是通过“切入点”规范单独指定要修改的代码,例如“在函数名称以'set'开头时记录所有函数调用”。 这允许将对业务逻辑不是很重要的行为(例如日志记录)添加到程序中,而不会使功能的核心代码混乱。 AOP为面向方面的软件开发奠定了基础。

这是《编程风格练习》重点系列的 12 帖子。其他帖子包括:

  1. 以编程风格介绍练习
  2. 以编程风格进行练习,将内容堆叠起来
  3. 编程风格的练习,Kwisatz Haderach风格
  4. 编程风格的练习,递归
  5. 具有高阶功能的编程风格的练习
  6. 以编程风格进行练习
  7. 以编程风格进行练习,回到面向对象的编程
  8. 编程风格的练习:地图也是对象
  9. 编程风格的练习:事件驱动的编程
  10. 编程风格的练习和事件总线
  11. 反思编程风格的练习
  12. 以面向方面的编程风格进行练习 (本文)
  13. 编程风格的练习:FP&I / O
  14. 关系数据库风格的练习
  15. 编程风格的练习:电子表格
  16. 并发编程风格的练习
  17. 编程风格的练习:在线程之间共享数据
  18. 使用Hazelcast以编程风格进行练习
  19. MapReduce风格的练习
  20. 编程风格的练习总结

Python中的AOP

在Python中应用AOP只是一个问题:

  1. 引用功能
  2. 将其包装到另一个功能中-建议
  3. 并用这个新功能覆盖对原始功能的引用

这将转换为原始Python代码中的以下内容:

defsort(word_freq): (1)returnsorted(word_freq.items(),key=operator.itemgetter(1),reverse=True)defprofile(f): (2)defprofilewrapper(*arg,**kw): (3)start_time=time.time()ret_value=f(*arg,**kw) (4)elapsed=time.time()-start_timeprint("%s(...) took %s secs"%(f.__name__,elapsed))returnret_valuereturnprofilewrapper (5)globals()[sort.__name__]=profile(sort) (6)
  1. 定义任何“标准”功能
  2. 将建议定义为功能
  3. 该代码本身就是一个函数,因为它将替换原始函数
  4. 使用传递给此函数的相同参数调用原始函数
  5. 返回profilewrapper函数作为值,使其成为高阶函数
  6. 用包装它的函数替换对原始sort()函数的引用

由于Python是一种解释型语言,因此该过程非常简单。

将Python代码移植到Kotlin

将原始代码移植到Kotlin会产生以下结果:

varsort=fun(frequencies:Map<String,Int>)=frequencies (1)  (2).map{it.keytoit.value}.sortedByDescending{it.second}fun<T,R>profile(f:(T)->R):(T)->R{returnfun(arg:T):R{ (2)valstart=System.currentTimeMillis()valresult=f.invoke(arg)valelapsed=start-System.currentTimeMillis()print("$f took $elapsed ms")returnresult}
}sort=profile(sort) (3)
  1. 与Python不同,不能在Kotlin中重新分配函数。 因此,我们需要创建一个匿名函数,并将其分配给可以重新分配的var
  2. 与JavaScript中一样,Kotlin允许创建匿名函数
  3. 重新分配var

这种简单的移植方式有效,但显然存在一些缺点:

调用sort功能

由于它是类型为KFunction1的变量-不再是函数-以下代码成为调用它的标准方式:

sort.invoke(mapOf<String,Int>())

幸运的是,可以使用简写形式的运算符,它看起来很像标准函数调用(但不是):

sort(mapOf<String,Int>())
多个包装器功能

分析功能的签名为profile(f: (T) → R): (T) → R 。 该参数和返回值是一个接受类型T的单个参数的函数。 在实际的代码库中,将存在需要概要分析并采用不同数量参数_e.g的函数。 没有一个或多个。 因此,我们需要为每个Arity创建一个专用的包装函数:

  1. profile0(f: () → R): () → R
  2. profile1(f: (T) → R): (T) → R
  3. profile2(f: (T, U) → R): (T, U) → R
  4. profile3(f: (T, U, V) → R): (T, U, V) → R
  5. 等等

这种方法的好处是一切都是明确的。 只需阅读源代码即可注意到profile()函数,以了解它包装了原始函数以执行其他代码。 在函数式编程中,这称为函数组合 。 可以组合更多功能,以添加更多其他功能。

但是,重新分配sort变量与函数式编程的原理相反。 上面的代码应进行一些修改,以获取更多的“ Kotlinesque”代码:

profile1<Map<String,Int>,List<Pair<String,Int>>>{sort(mapOf())}

即便如此,对于明确性还是有一个缺点:由于需要显式调用组成profile1()函数,因此很容易忘记它。 如果不调用该函数,则不会进行性能分析,这对Ops团队非常困扰。

“真实” AOP

在函数式编程在业界流行之前,AOP已通过字节码操作在JVM上可用。 有两种不同的口味:

  1. 构建时编织:根据“外部源”更改从源代码生成字节码
  2. 加载时编织(LTW):根据“外部源”更改JVM加载字节码

AspectJ是JVM上的一个AOP框架,能够同时实现这两个功能。 上述外部源的结构大致如下:

  1. 忠告 :将要应用的一段代码, 例如上面的概要代码
  2. 切入点 :在何处应用建议的规范。 切入点有不同的风格。 例如,有一个before切入点,它将建议的代码运行在实际代码之前,而其镜像则在after切入点运行。 函数调用周围应用了另一个切入点。 这正是我们进行分析所需的。 事不宜迟,以下是该代码的源代码:
@Aspect
classAspectUtils{@Around("execution (* ch.frankel.blog.eps..*(..))") (1)funprofile(joinPoint:ProceedingJoinPoint):Any?{ (2)valstart=System.currentTimeMillis() (3)valresult=joinPoint.proceed() (4)println("$joinPoint took ${System.currentTimeMillis() - start} ms") (3)returnresult}
}
  1. 应在ch.frankel.blog.eps软件包中每个功能的执行周围提供建议
  2. ProceedingJoinPoint参数将由AspectJ传递
  3. 像上面一样分析代码
  4. 执行原始的包装功能。 注意,不需要传递实际参数,所有这些都由框架负责

为了使这项工作有效,需要实际的AspectJ运行时库作为依赖项,以及JCabi Maven插件以实现构建时编织。

这种方法的好处是,开发人员无需关注配置文件代码:团队成员可以编写AOP代码并进行配置。 它在开发过程的最后或同时涉及一个方面,并且所有必需的功能现在都将自动进行概要分析! 更好的是,使用LTW ,可以生成标准的JAR,并且可以在运行时通过Java代理应用方面(这不是此处选择的方式)。 在这方面,AOP是解决跨领域问题( 例如对代码库进行概要分析,日志记录等)并消除实际调用所需代码的所有重复性任务的绝佳且行之有效的方法。

只是要知道,尽管有这个明显的优点,但由于涉及“黑魔法”,一些人仍在积极反对AOP。

结论

因为Python是一种解释型语言,所以AOP只是用新的引用替换原始函数引用的问题。 在Kotlin-和大多数JVM语言中,AOP有三个选项:

  1. 功能组合,开发人员需要明确包装功能
  2. 通过AspectJ进行构建时编织,该构建在构建时应用建议,从而允许“业务代码”与跨领域关注点之间的分离
  3. LTW还通过AspectJ在运行时应用建议,从而进一步减少了耦合,并使JAR成为源代码的确切产品
这篇文章的完整源代码可以在Github上找到。

翻译自: https://blog.frankel.ch/exercises-programming-style/12/

面向对象编程练习