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

避免整个模块的函数调用--这个Hack有多糟糕?

避免整个模块的函数调用是一种编程技巧,通常被称为"Monkey Patching"或"函数劫持"。它指的是在运行时修改已存在的代码,将一个函数替换为另一个函数,以达到修改原有功能或添加新功能的目的。

尽管Monkey Patching在某些情况下可能会解决问题,但它也存在一些潜在的问题和风险,因此被认为是一种糟糕的做法。以下是一些与Monkey Patching相关的问题:

  1. 可读性和可维护性:Monkey Patching会导致代码变得难以理解和维护。由于函数的实现可能被动态修改,阅读代码时很难确定实际执行的是哪个函数。这增加了代码的复杂性,并可能导致团队成员之间的沟通和协作困难。
  2. 难以调试:Monkey Patching会给调试带来困难。由于函数的实现可能在运行时被修改,调试器可能无法正确地跟踪代码执行路径,从而增加了调试的复杂性。
  3. 不可预测的行为:Monkey Patching可能导致不可预测的行为。当多个模块或库同时进行Monkey Patching时,可能会发生冲突和意外的行为。这种不确定性使得代码的行为难以预测,增加了出错的可能性。
  4. 兼容性问题:Monkey Patching可能导致与其他代码或库的兼容性问题。由于Monkey Patching修改了原有的代码逻辑,可能会破坏其他代码对原有逻辑的依赖,从而导致错误或异常。

综上所述,尽管Monkey Patching在某些情况下可能是一种解决问题的临时手段,但它通常被视为一种糟糕的做法。为了保持代码的可读性、可维护性和可靠性,推荐避免使用Monkey Patching,并采用更规范和可控的方式进行代码修改和扩展。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云函数计算(Serverless):https://cloud.tencent.com/product/scf
  • 腾讯云容器服务(TKE):https://cloud.tencent.com/product/tke
  • 腾讯云云原生应用平台(TKE App):https://cloud.tencent.com/product/tke-app
  • 腾讯云数据库(TencentDB):https://cloud.tencent.com/product/cdb
  • 腾讯云安全产品:https://cloud.tencent.com/solution/security
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

picu后端架构总结

首先我们项目的定位是一个图片,音频为主体分享应用,于是服务器对于大资源存储了常规数据库,nginx静态资源存储和对象存储服务选型问题.常规数据库(如mysql)业务存储不可避免遇到服务器带宽问题和单点问题...Token而后利用这个临时Token存储,读取资源.由于COS不能设计给CVM回调函数,于是基本设计是通过两条请求分离1....校验,存Redis数据库当中.在这个流程中一开始我们单机设计是在本地对于key做一个缓存,然后再确认请求中读取缓存;通过超时删除策略清理缓存池.这样策略当接入机时候需要cookie/session...,文档不全,内部业务更新需要宕机整个业务系统 hack python sdk相当于把接口直接暴露在公网,安全问题和稳定性有待考究 于是我们分离核心模块与算法模块到内部服务器,类似外网负载均衡业务,接入内网负载均衡服务...内网CLB: 图像识别和调用外部sdk网络耗时会使得整个系统qps变低,应该加入CMQ进行限流削锋. 云Redis存储: 腾讯云redis不支持跨地,也就是没有云sql异地容灾.

1.1K20

如何避免自己写代码成为别人眼中一坨屎

: TODO 待处理问题; FIXME 已知问题代码; HACK 不得不采用粗糙解决方案; 在注释中用精心挑选输入输出例子进行说明; 注释应该声明代码高层次意图,而非明显细节; 不要在代码中加入代码著作信息...: 不恰当信息; 废弃注释; 冗余注释; 糟糕注释; 注释掉代码; 唯一真正好注释是你想办法不去写注释: 不要有循规式注释,比如setter/getter注释; 不要添加日志式注释,比如修改时间等信息...; 某个公共函数调用私有函数紧随其后; 最理想参数是零参数,最长不要超过三个入参,尽量不要输出参数: 如果函数传入三个及以上参数最好将其抽象为类; 标识参数十分丑陋,向函数传入布尔值用于区分不同业务做法很丑陋...,应该拆分为多个函数; 别返回null值,抛出异常或者返回特殊对象,尽量避免NPE; 别传入null值; 四、异常与错误 抽离try catch包含代码块,其中代码块抽象为一个函数; 抛出每个异常,...,应该把他们放在一起,而且调用者应该放在被调用者上面; 自上向下展示函数调用依赖顺序; 应该把解释条件意图函数抽离出来,尽可能将条件表达为肯定形式; 不要继承常量,比如接口中定义常量,不要使用继承欺骗编程语言作用范围规则

7392118
  • Wannacry深度解析:第一阶段tasksche

    在暗网,你可以买到各种各样攻击组件,组成一个有效攻击实体;例如,漏洞,有加载器,有加密模块等,那么我可以根据我需要去买合适模块,然后在进行组装成一个真正具有攻击性恶意程序。...其中这些模块就是Hack Weapon,我们收集到很多Sample都是很多模块组合,那通过in-depth逆向分析后发现了一款恶意软件中存在有多种攻击武器时候能否将这些攻击武器提取出来,单独建立一个...我曾经抽取过一款针对程序中String进行加密,并在始终之前进行解密Hack Weapon,当时我并没有想到恶意软件会有模块化这种设计,直到在另外一款恶意软件中见到同样行为,并且进行抽取发现整个function...这个函数创建了CResource对象并调用了它Initialize方法进行初始化。...调用导出函数,攻击开始。 至此,tasksche悄无声息将一个PE dll加载并运行,整个过程无法通过Proc monitor等软件发现。

    1.4K60

    如何避免自己写代码成为别人眼中一坨屎!

    : TODO 待处理问题; FIXME 已知问题代码; HACK 不得不采用粗糙解决方案; 在注释中用精心挑选输入输出例子进行说明; 注释应该声明代码高层次意图,而非明显细节; 不要在代码中加入代码著作信息...100行那么长,20行封顶最好: if else while等控制语句其中代码块应该只有一行,也就是一个函数调用语句; 函数锁进层次不应该多于两层; 一个函数只做一件事,一个函数不应该能抽象出另外一个函数...; 某个公共函数调用私有函数紧随其后; 最理想参数是零参数,最长不要超过三个入参,尽量不要输出参数: 如果函数传入三个及以上参数最好将其抽象为类; 标识参数十分丑陋,向函数传入布尔值用于区分不同业务做法很丑陋...,应该拆分为多个函数; 别返回null值,抛出异常或者返回特殊对象,尽量避免NPE; 别传入null值; 四、异常与错误 抽离try catch包含代码块,其中代码块抽象为一个函数; 抛出每个异常,...,应该把他们放在一起,而且调用者应该放在被调用者上面; 自上向下展示函数调用依赖顺序; 应该把解释条件意图函数抽离出来,尽可能将条件表达为肯定形式; 不要继承常量,比如接口中定义常量,不要使用继承欺骗编程语言作用范围规则

    64370

    如何避免自己写代码成为别人眼中一坨屎!

    : TODO 待处理问题; FIXME 已知问题代码; HACK 不得不采用粗糙解决方案; 在注释中用精心挑选输入输出例子进行说明; 注释应该声明代码高层次意图,而非明显细节; 不要在代码中加入代码著作信息...100行那么长,20行封顶最好: if else while等控制语句其中代码块应该只有一行,也就是一个函数调用语句; 函数锁进层次不应该多于两层; 一个函数只做一件事,一个函数不应该能抽象出另外一个函数...; 某个公共函数调用私有函数紧随其后; 最理想参数是零参数,最长不要超过三个入参,尽量不要输出参数: 如果函数传入三个及以上参数最好将其抽象为类; 标识参数十分丑陋,向函数传入布尔值用于区分不同业务做法很丑陋...,应该拆分为多个函数; 别返回null值,抛出异常或者返回特殊对象,尽量避免NPE; 别传入null值; 四、异常与错误 抽离try catch包含代码块,其中代码块抽象为一个函数; 抛出每个异常,...,应该把他们放在一起,而且调用者应该放在被调用者上面; 自上向下展示函数调用依赖顺序; 应该把解释条件意图函数抽离出来,尽可能将条件表达为肯定形式; 不要继承常量,比如接口中定义常量,不要使用继承欺骗编程语言作用范围规则

    53220

    Python程序员最常犯十个错误,看完你自己都笑了

    要解决这个常见Python问题方法中,需要使用一些hack技巧: 请注意!我们在这里利用了默认参数来实现这个lambda匿名函数。有人可能认为这样做很优雅,有人会觉得很巧妙,还有人会嗤之以鼻。...b.py模块中对a模块唯一引用,就是调用了a模块foo()函数。但是那个函数调用发生在g()函数当中,而a.py或b.py模块中都没有调用g()函数。所以,不会出现问题。...这里问题是,在导入b.py过程中,它试图引用a.py模块,而a.py模块接着又要调用foo()函数这个foo()函数接着又试图去访问b.x变量。...解决这个问题一种非常简单方法,就是简单地修改下b.py模块,在g()函数内部才引用a.py: 现在我们再导入b.py模块的话,就不会出现任何问题了: 常见错误8:模块命名与Python标准库模块名冲突...这也是导致一些严重错误原因。 因此,Python程序员要格外注意,避免使用与Python标准库模块相同名称。毕竟,修改自己模块名称比提出PEP提议修改上游模块名称且让提议通过,要来得容易

    1.1K40

    Python | 十个Python程序员易犯错误

    要解决这个常见Python问题方法中,需要使用一些hack技巧: ? 请注意!我们在这里利用了默认参数来实现这个lambda匿名函数。有人可能认为这样做很优雅,有人会觉得很巧妙,还有人会嗤之以鼻。...b.py模块中对a模块唯一引用,就是调用了a模块foo()函数。但是那个函数调用发生在g()函数当中,而a.py或b.py模块中都没有调用g()函数。所以,不会出现问题。...这里问题是,在导入b.py过程中,它试图引用a.py模块,而a.py模块接着又要调用foo()函数这个foo()函数接着又试图去访问b.x变量。...但是这个时候,b.x变量还没有被定义,所以才出现了AttributeError异常。 解决这个问题一种非常简单方法,就是简单地修改下b.py模块,在g()函数内部才引用a.py: ?...这也是导致一些严重错误原因。 因此,Python程序员要格外注意,避免使用与Python标准库模块相同名称。毕竟,修改自己模块名称比提出PEP提议修改上游模块名称且让提议通过,要来得容易

    1.5K100

    代码优化技巧·代码编写好习惯·代码规范

    代码优化好习惯 减少对变量重复计算 明确一个概念,对方法调用,即使方法中只有一句语句,也是消耗,包括创建栈帧、调用方法时保护现场、调用方法完毕时恢复现场等。...使用同步代码块替代同步方法 除非能确定一整个方法都是需要进行同步,否则尽量使用同步代码块,避免对那些不需要进行同步代码也进行了同步,影响了代码执行效率。 28....一定要给常量加注释 团队统一定义标记 TODO 待处理问题 FIXME 已知问题代码 HACK 不得不采用粗糙解决方案 在注释中用精心挑选输入输出例子进行说明 注释应该声明代码高层次意图...,应该拆分为多个函数 别返回null值,抛出异常或者返回特殊对象,尽量避免NPE 别传入null值 异常与错误 抽离try catch包含代码块,其中代码块抽象为一个函数 抛出每个异常,都应当提供足够环境说明...,应该把他们放在一起,而且调用者应该放在被调用者上面 自上向下展示函数调用依赖顺序 应该把解释条件意图函数抽离出来,尽可能将条件表达为肯定形式 不要继承常量,比如接口中定义常量,不要使用继承欺骗编程语言作用范围规则

    1.2K10

    如何避免自己写代码成为别人眼中一坨屎!

    : TODO 待处理问题; FIXME 已知问题代码; HACK 不得不采用粗糙解决方案; 在注释中用精心挑选输入输出例子进行说明; 注释应该声明代码高层次意图,而非明显细节; 不要在代码中加入代码著作信息...100行那么长,20行封顶最好: if else while等控制语句其中代码块应该只有一行,也就是一个函数调用语句; 函数锁进层次不应该多于两层; 一个函数只做一件事,一个函数不应该能抽象出另外一个函数...; 某个公共函数调用私有函数紧随其后; 最理想参数是零参数,最长不要超过三个入参,尽量不要输出参数: 如果函数传入三个及以上参数最好将其抽象为类; 标识参数十分丑陋,向函数传入布尔值用于区分不同业务做法很丑陋...,应该拆分为多个函数; 别返回null值,抛出异常或者返回特殊对象,尽量避免NPE; 别传入null值; 四、异常与错误 抽离try catch包含代码块,其中代码块抽象为一个函数; 抛出每个异常,...,应该把他们放在一起,而且调用者应该放在被调用者上面; 自上向下展示函数调用依赖顺序; 应该把解释条件意图函数抽离出来,尽可能将条件表达为肯定形式; 不要继承常量,比如接口中定义常量,不要使用继承欺骗编程语言作用范围规则

    72310

    手把手教你|拦截系统调用

    一、什么是系统调用 系统调用 是内核提供给应用程序使用功能函数,由于应用程序一般运行在 用户态,处于用户态进程诸多限制(如不能进行 I/O 操作),所以有些功能必须由内核代劳完成。...而内核就是通过向应用层提供 系统调用,来完成一些在用户态不能完成工作。 说白了,系统调用其实就是函数调用,只不过调用是内核态函数。...因为用户态程序由于内存保护机制,不能改写内核态数据。而内核模块运行在内核态,所以能够跳过这个限制。...要获取 sys_call_table 数组虚拟内存地址两种方法: 第一种方法:从 System.map 文件中读取 System.map 是一份内核符号表,包含了内核中变量名和函数名地址,在每次编译内核时...\n"); return 0; } /* * 模块初始化函数模块入口函数,加载模块调用 */ static int __init init_hack_module(void) {

    1.8K10

    N年前旧代码,爆炸

    最近刚接到任务是要在官网商城PC版上面添加一些功能。第一次体会到糟糕代码是多么可怕。不论是从项目结构,还是代码风格,经历了“几代人”“锤炼”,早已风化腐朽多时。...由于历史原因,整个PC站点是由Nginx拼装html页面,Js也是由Nginx合并后,杂乱各种命名,年久失修公共库。...以及一个09年弹框插件,据说是从一号店那边过来,好在此人留下了QQ号,已经33岁了。。。 兼容性代码,以及很多hack。...现在看来最大坑是用jsp模板渲染,函数调用都是直接写在DOM结构中,onclick事件触发。...到了今天,老代码不敢动,新代码只能不断往上加,难以想象越是到后面会怎么样,每个刚接触的人都需要花费时间来阅读理解这些东西,后面的人更是不想接,这坑可真是大。eval,混乱压缩,都是不规范导致

    30320

    关于烂代码那些事(下)

    更重要意义在于,写不出单元测试代码往往意味着糟糕设计:模块依赖太多或者一个函数职责太重,想象一下,想要执行一个函数却要模拟十几个输入对象,每个对象还要模拟自己依赖对象……如果一个模块无法被单独测试...return foo.foo().isEmpty(); } }  这样做好处是修改函数时不需要改动所有调用方,烂代码特征之一就是模块耦合比较高,往往一个函数几十处调用,牵一发而动全身...除此之外,尽量控制自己代码洁癖,不要把代码切成一大堆豆腐块,会给日后维护工作带来很多不必要成本。  方案可以提前review几次,参考一线工程师意见,避免实际动手时才冒出新问题。  ...我现在遇到很多面试者说程序优化时总是喜欢说一些玄乎东西:调用栈、尾递归、内联函数、GC调优……但是当我问他们:把一个普通函数改成内联函数是把原来运行速度是多少程序优化成多少了,却很少有人答出来;或者是扭扭捏捏说...,应该很多,因为这个函数会被调用很多遍。

    20020

    你没有抓住 Promises 要点

    我已经讲过了 promises 酷,所以我现在不说这个了,我现在要说是一个现今 JavaScript 库中非常令人不安趋势:声称支持 promise,却根本没有抓住它要点。...rejection 部分代码就像同步代码副本一样,在整个调用链中,fulfillment 部分会执行,也会在某个时候被 rejection 中断,但是只有预先声明了 handler 才能处理它。...为了说明这一点荒谬,你可以想一想一个同步例子:如果你把一个函数返回值给了两个人,其中一个可以改变一下返回值里面的东西,然后这两个人手里返回值居然就抛出异常来了!...; } 如果 API 使用者坚持使用 JQuery promises 的话,你大概只有两种选择:在执行过程中莫名其妙地、令人困惑地失败,或者彻底失败,并且阻塞你继续使用整个类库。这可真糟糕啊。...继续向前 这就是我为什么尽可能地避免在 Ember 中使用回调函数聚合器了,这也是我写这篇文章原因,而且,你可以看一下我写这个准确兼容 Promises/A 规范套件,这样我们就可以在认识层面上达成一致了

    61810

    【JS 口袋书】第 6 章:JS 中闭包与模块

    Redux是另一个“好”全局变量例子:整个应用程序状态存储在一个JS对象中,这个对象可以从整个应用程序(通过Redux)访问。...; } 咱们同事在另一个文件中创建一个名为arr新全局数组几率多大?我觉得非常高。JS中全局变量非常糟糕另一个原因是引擎足够友好,可以为咱们创建全局变量。...,幸运是,JS 一直一个内置机制来解决这个问题。...在ES6之前,除了将变量和方法封装在函数中之外,没有其他方法可以模块化JS代码并提供私有变量与方法”。闭包与立即调用函数表达式相结合 是至今通用解决方案。...JS 中闭包是一种能够“记住”其变量环境函数,即使在后续函数调用之间也是如此。 当咱们从另一个函数返回一个函数时,会创建一个闭包,这个模式也称为“工厂函数”。 思考 什么是闭包?

    71730

    JS 中闭包与模块

    Redux是另一个“好”全局变量例子:整个应用程序状态存储在一个JS对象中,这个对象可以从整个应用程序(通过Redux)访问。...; } 咱们同事在另一个文件中创建一个名为arr新全局数组几率多大?我觉得非常高。JS中全局变量非常糟糕另一个原因是引擎足够友好,可以为咱们创建全局变量。...,幸运是,JS 一直一个内置机制来解决这个问题。...JS 中闭包是一种能够“记住”其变量环境函数,即使在后续函数调用之间也是如此。当咱们从另一个函数返回一个函数时,会创建一个闭包,这个模式也称为“工厂函数”。 思考 什么是闭包?...使用全局变量哪些不好方面? 什么是 JS 模块,为什么要使用它?

    1.1K10

    Python程序员最常犯十个错误

    要解决这个常见Python问题方法中,需要使用一些hack技巧: >>> def create_multipliers():......b.py模块中对a模块唯一引用,就是调用了a模块foo()函数。但是那个函数调用发生在g()函数当中,而a.py或b.py模块中都没有调用g()函数。所以,不会出现问题。...这里问题是,在导入b.py过程中,它试图引用a.py模块,而a.py模块接着又要调用foo()函数这个foo()函数接着又试图去访问b.x变量。...解决这个问题一种非常简单方法,就是简单地修改下b.py模块,在g()函数内部才引用a.py: x = 1def g(): import a # This will be evaluated...这也是导致一些严重错误原因。 因此,Python程序员要格外注意,避免使用与Python标准库模块相同名称。毕竟,修改自己模块名称比提出PEP提议修改上游模块名称且让提议通过,要来得容易

    97370

    笨办法学 Python · 续 练习 12:复习

    最后,记录和绘制指标,看看这些可能变化是否帮助,但也要确保它们不会干扰你表现。 这不需要是正式科学流程,它就是实用。所有你需要是,将它当作一本日志来帮助你客观地看待你工作方式。...限制你自己 45 分钟一次,但不要把这个最终项目当作一个黑魔法。相反,这是你正在开发黑魔法下一步。 在我完成一些快速 Hack ,来测试一个想法之后,我将删除它或清理它。...如果黑魔法没有那么糟糕,那么我要做就是在扩展之前进行清理。 将黑魔法转化为健壮程序一种有效技术是,使用自动化测试套件,将它关键元素提取到库中。这迫使你将代码视为将在其他代码中使用代码。...一旦清理和运行完毕,和之前一样,但是带有函数,我将这些函数放进模块,并确保原始代码保持有效。 记住,不要在清理过程中改变事情,只需要重新组织并修复它。...在你经常运行命令列表中,尝试一个新命令(参见练习 11),并尝试这个完整流程。完成一个快速 Hack,然后清理它,使它变得正式。

    20310

    webpack模块化原理-commonjs

    } ]); 可以看到,整个打包生成代码是一个IIFE(立即执行函数),函数内容我们待会看,我们先来分析函数参数。...为什么要这样做,是因为浏览器本身不支持模块化,那么webpack就用函数作用域来hack模块效果。...定义了__webpack_require__ 这个函数函数参数为模块id。这个函数用来实现模块require。...然后调用模块函数,也就是前面webpack对我们模块包装函数,将module、module.exports和__webpack_require__作为参数传入。...注意这里做了一个动态绑定,将模块函数调用对象绑定为module.exports,这是为了保证在模块this指向当前模块调用完成后,模块标记为已加载。 返回模块exports内容。

    72630

    面向对象先导课感想

    而且都是在整个项目中指定一个入口点类,然后从 static void main 函数入口,就像这样(简单A+B问题实现): C# using System; using System.Collections.Generic...在java中,如果一个函数(方法)需要抛出异常的话,是必须在当前函数(方法)处进行声明。同时外部调用这个函数(方法)部分也必须使用异常处理语句包装起来(即必须放进 try { } 中)。...,而且弱类型语言普遍个叫做eval函数,可以基本上取代掉传统反射类)。...也就是说实际上即便你直接hack的人只有一个或者几个,但实际上作用到的人是所有人(很多时候,很多错误,都是非常具有共性,一个hack点常常可以卡掉非常程序)。...建议更多程序让大家开放hack,也可以让真正足够能力hack的人能发挥应有的作用。(不过这样一来就必须做好严密反作弊反抄袭系统,为了杜绝由于代码公开而导致抄袭现象。

    79040

    在您CI或测试环境中使用Docker-in-Docker?三思而后行

    许多人使用它来运行CI(例如使用Jenkins),这看起来很好,但它们会遇到许多“有趣”问题,可以通过将Docker套接字绑定到Jenkins容器来避免。 让我们看看这意味着什么。...停止新Docker守护进程 重复 随着Docker-in-Docker出现,这被简化为: hackity hack 构建+一步完成 重复 好多了,对吧?...Docker-in-Docker:糟糕 然而,与流行看法相反,Docker-in-Docker并非100%由闪光,小马和独角兽制成。我意思是,一些问题需要注意。...一个是关于像AppArmor和SELinux这样LSM(Linux安全模块):当启动容器时,“内部Docker”可能会尝试应用会使“外部Docker”发生冲突或混淆安全配置文件。...Docker为Device Mapper目标名称添加了一些基本命名空间,因此如果Docker多次调用在同一台机器上运行,它们就不会互相踩踏。

    69710
    领券