重新组织函数----Extra Method(提炼函数)

利用ZipCrypto已知明文攻击破解加密压缩包:原理、工具与实战 流加密是一种对称加密技术,通过密钥流与明文按位异或实现数据保护。其安全性高度依赖密钥生成算法的随机性和初始化向量的不可预测性。ZipCrypto作为ZIP格式的传统加密方案,在密钥初始化阶段存在设计缺陷,使得攻击者能够利用文件格式的规范性获取已知明文,进而通过可逆的密钥流算法反推出加密密钥,实现无需密码的解密。这种已知明文攻击技术在渗透测试、应急响应和CTF竞赛中具有重要价值,能够高效恢复被ZipCrypto加密的敏感数据。bkcrack作为该领域的核心工具,自动化了密钥推导过程,显著提升了攻击效率。掌握这 阅读详情

你有一段代码可以被组织在一起并独立出来

讲这段代码放在一个独立函数中,并让函数名称解释该函数的用途

范例:无局部变量

void printOwing(double amount){

printBanner();

//printDetail

System.out.println("name:"+_name);

System.out.println("amount:"+amount);

}

重构后代码:

void printOwint(double amount){

printBanner();

printDetail(amount);

}

void printDetail(double amount){

System.out.println("name:"+_name);

     System.out.println("amount:"+amount);

}


动机

Extra Method(提炼函数)是最常用的重构手法之一。当看见一个过长的函数或者一段需要注释才能让人理解用途的代码,就应该将这段代码放进一个独立的函数中去。

范例:有局部变量

果真这么简单?这个重构手法的困难点在哪里?是的,就在局部变量,包括传进源函数的参数和源函数所声明的零时变量。局部变量的作用域仅限于源函数,所以当我使用Extra Method(提炼函数)时,必须花费额外功夫去处理这些变量。某些时候它们可能妨碍我,使我根本无法进行这项重构。
局部变量最简单的情况是:被提炼代码段只是读取这些变量的值,并不修改它们。这种情况可以简单的将它们当作参数传给目标函数

void printOwing{
Enumeration e=orders.elements();
double outstanding=0.0;
printBanner();

//calculate outstanding
while(e.hasMoreElements){
Order order=(Order)e.nextElement();
outstanding +=each.getAmount();
}
System.out.println("name:"+_name);
System.out.println("amount:"+outstanding);

}


就可以讲打印详细信息提炼为带一个参数的函数:
void printOwing{
Enumeration e=orders.elements();
double outstanding=0.0;
printBanner();

//calculate outstanding
while(e.hasMoreElements){
Order order=(Order)e.nextElement();
outstanding +=each.getAmount();
}
printDetails(outstading);
}

void printDetails(double outstanding){
System.out.println("name:"+_name);
System.out.println("amount:"+outstanding);
}

必要的话可以用这种手法处理多个局部变量


范例:对局部变量再赋值


如果被提炼的代码对局部变量赋值,问题就变得复杂了。这里只讨论临时变量的问题。如果你发现源函数的参数被赋值,应该马上使用Remove Assignments to Parameters(131)。
被赋值的临时变量也分为两种情况。较简单的情况是:这个变量只在被提炼的代码段中使用。果真如此,你可以将这个临时变量的声明移动到被提炼的代码段中,然后一起提炼出去。另一种情况是:被提炼代码段之外的代码也使用了这个变量。这又分为两种情况:如果这个变量在被提炼代码段之后再未被使用,你只需要在目标函数中修改它就可以了;如果被提炼代码段之后的代码还使用了这个变量,你就需要让目标函数返回该变量改变后的值。下列代码可以说明这几种不同的情况。

void printOwing(){
Enumeration e=_orders.elements();
double outstanding=0.0;
printBanner();
//calculate outstanding
while(e.hasMoreElements){
Order order=(Order)e.nextElement();
outstanding+=order.getAmount();
}
printDetails(outstanding);

}

现在把“计算”代码提炼出来:
void printOwing(){
printBanner();
double outstanding=getOutstanding();
printDetails(outstanding);

}

double getOutstanding(){
Enumeration e=_orders.elements();
double outstanding=0.0;
while(e.hasMoreElements){
Order order=(Order)e.nextElement();
outstanding+=order.getAmount();
}
return outstading;
}





Python @classmethod 装饰器详解:从工厂方法到设计模式实战 在面向对象编程中,类方法是绑定到类而非实例的方法,它通过接收类本身作为第一个参数(通常命名为 cls)来实现。其核心原理在于方法解析时,Python 解释器会将类作为隐式参数传入,从而允许方法在无需实例化的情况下访问和操作类级别的属性与状态。这一机制的技术价值在于提供了清晰的代码组织方式,支持多态性,并能作为灵活的工厂方法,用于创建类的实例。典型的应用场景包括实现替代构造函数、管理类级状态(如单例模式)、在继承体系中定义可扩展的接口,以及编写与类逻辑相关但不依赖具体实例的工具函数。例如,在构建数据模型或工具 阅读详情

相关推荐

STM32L433使用DSP库配置过程

STM32L433中有FPU,在使用中为了使用其中的部分函数,需要对其进行配置。     配置成功后做些总结,留待后续复习备忘,同时也希望有朋友像我一样使用DSP库配置时少走弯路,留作交流。

在在在的博客 4550

2018技术趋势复盘:AI工程化、边缘计算与区块链的理性回归

人工智能、边缘计算和区块链是近年来备受关注的核心技术领域。人工智能通过机器学习算法实现数据驱动的智能决策,其价值在于将复杂模型与业务闭环结合,实现可持续优化,例如应对模型漂移等工程化挑战。边缘计算将计算能力下沉至数据源头,旨在满足低延迟、高带宽和隐私保护需求,但其落地需克服异构环境与资源限制,适用于对延迟极度敏感或网络不稳定的特定场景。区块链技术通过分布式账本确保数据不可篡改,核心在于降低多方协作的信任成本,而非消灭信任,其可扩展性是企业级应用的关键。这些技术正从概念验证走向大规模工程实践,深刻影响着智能制

weixin_30628077的博客 431

CODESYS EtherCAT通讯断了怎么办?手把手教你用ST语言写状态监测程序(附完整代码)

本文详细解析了CODESYS平台下EtherCAT通讯中断的故障排查与恢复方法,通过ST语言编写状态监测程序实现链路监测、故障隔离和伺服恢复。文章包含完整代码示例,帮助工程师快速诊断EtherCAT网络问题,提升工业自动化设备的运行稳定性。

weixin_30919571的博客 209

idea快速将一段代码抽成一个方法快捷键(Extra Method)

快捷键 ctrl+alt+M 步骤: 选中你要抽成方法的代码行,按下快捷键Ctrl + alt +M,选择自己 例子 文章有待补充,请凑合着用!!!

dsl 1万+

Unity 调用安卓内部安装apk

一、申请权限 应用内安装其他应用的权限属于特殊权限,需要在特殊申请。 Uri packageURI = Uri.parse("package:" + mContext.getPackageName()); Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI); startA...

BDDNH的博客 1238

蓝牙HCI Dongle实战:从芯片选型到协议栈集成的完整指南

本文详细介绍了蓝牙HCI Dongle的实战应用,从芯片选型到协议栈集成的完整指南。通过对比CSR8510、nRF52840等主流芯片的性能和价格,提供选型建议和避坑技巧。同时,深入解析Zephyr协议栈移植和常见问题排查,帮助开发者高效完成蓝牙项目开发。

weixin_30786657的博客 322

python 学习记录-函数

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。 定义一个函数 你可以定义一个由自己想要功能的函数,以下是简单的规则: 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。 函数内容以冒号起始,并且缩进。 return [表达式]...

jslpyuyan的博客 257

MATLAB绘图中文乱码终极解决方案:从方框到清晰显示的全面指南

本文提供了MATLAB绘图中文乱码的全面解决方案。针对中文显示为方框的问题,从单次绘图的临时字体设置,到通过修改默认配置实现一劳永逸,再到系统级字体排查与Java环境配置,给出了详细的步骤指南。文章还涵盖了字体名称指定、图像导出防丢失以及跨平台协作等高级技巧,帮助用户彻底解决中文乱码困扰。

weixin_29093017的博客 613

【UE】简单介绍“Extra Win Function”插件的功能

1. “Is Internet Available” 2. “Get Device Platform” 3. “Get Android Device RAMSize” 4. “Get Processor Core Count” 5. “Is Battery Supported” 6. “Is Battery Charging” 7. “Get Computer Username” 8. “Get Device Name” 9. “Is Microphone Available” ...

ChaoChao66666的博客 620

解密QtIFW高级配置:用XML+JS打造品牌化安装界面(含动态水印/多语言技巧)

本文深入探讨了如何利用Qt Installer Framework(QtIFW)的高级配置功能,通过XML和JavaScript打造专业、品牌化的软件安装界面。文章详细解析了企业级项目目录结构设计、模块化配置文件编写、CSS样式表深度定制、动态水印实现以及智能多语言许可证管理等核心技巧,旨在帮助开发者超越基础打包,为Windows和Linux平台构建具有卓越用户体验的安装程序。

read5的博客 528

开发具有情感分析能力的AI Agent

本文将深入探讨开发具有情感分析能力的AI Agent的各个方面。我们将首先介绍情感分析的基础知识,包括定义、背景和应用领域。接着,我们将详细讲解情感分析的核心概念、数据处理方法和算法原理。随后,文章将展示如何设计情感分析系统架构,并进行项目实战,包括环境安装、源代码实现和案例分析。最后,我们将总结最佳实践和注意事项,为读者提供进一步学习的资源。情感分析(Sentiment Analysis),也称为意见挖掘,是自然语言处理(NLP)的一个分支。

SuperAGI2025 1146

提炼函数(Extract Method)

重构优化,提炼函数(Extract Method)

空口白话的博客 567

2023年下半年网络工程师案例分析真题答案解析

R1] ip route-static 0.0.0.0 0.0.0.0 GigabitEthemet2/0/1 (3) track (4) R1 to R2 //配置R1的缺省路由,联动BFD使得R1到2的流量优先走R1->S1->R2链路,当此链路发生故障时,流量切换到R1->R3->R2链路上。当同一VLAN内也需要网络隔离时,我们可采用交换机的(2)功能,若在配置了二层隔离后,部分主机有互通的需求,则可在需求主机的网关上配置(3)功能。不需要,MAC地址是数据链路层封装以太帧的地址标识。

鹿鸣天涯 750

生产级多维聚合:从银行风控实战提炼的7种pandas聚合模式

多维聚合是数据分析的核心能力,指在多个分组维度和时间窗口下对异构指标进行协同计算。其底层原理涉及哈希分组、窗口滑动、索引对齐与内存优化等关键技术,直接决定分析结果的准确性、可审计性与上线稳定性。在金融风控、电商运营、实时BI等高要求场景中,它支撑着滚动均值预警、动态阈值分层、跨周期累计、维度矩阵展开等关键业务逻辑。区别于教学式groupby,生产级聚合必须处理空值策略、列名工程、类型安全与性能熔断。本文基于银行PB级交易流水实战,系统梳理七类经87个真实需求验证的pandas聚合范式,覆盖多列异构聚合、业务

jardownload的博客 421

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【山大智云项目日志】(十)源码分析之seahub-extra

2021SC@SDUSC

weixin_45816464的博客 710

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

ubuntu/kali设置百度/搜狗输入法切换输入法----初始化设置--重要

设置第二行那个Extra key for trigger input method为shift both。点击图中的global按钮。

279

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

编程函数核心解析:从概念到实战应用

函数是编程语言中的基础概念,它本质上是一段可重复调用的代码块,遵循“输入-处理-输出”的核心模型。其原理在于通过封装特定逻辑,实现代码的模块化。这一机制的技术价值在于显著提升代码的可维护性和复用性,是践行DRY(Don‘t Repeat Yourself)原则、降低软件复杂度的关键手段。在应用场景上,函数广泛适用于处理重复计算逻辑、验证数据格式、执行批量任务以及实现复杂业务模块化等工程实践。本文以Python为例,深入探讨了如何通过定义与调用函数来解决代码重复和逻辑复杂等实际问题,并涵盖了参数传递、返回值、

weixin_30482181的博客 384

gotags核心功能解析:从命令行到Vim集成全攻略

gotags是一款兼容ctags的Go语言标签生成工具,能够帮助开发者快速定位代码中的函数、类型、变量等定义,提升Go项目的开发效率。本文将全面介绍gotags的核心功能、安装方法及Vim集成技巧,让你轻松掌握这一实用工具。 ## 一、认识gotags:Go开发者的代码导航利器 ### 1.1 什么是gotags? gotags是一个专为Go语言设计的标签生成工具,它能够扫描Go源代码并生成

gitblog_00151的博客 1059

可组合型数据团队:用能力契约解耦组织与技术

在数据驱动成为企业核心能力的今天,‘数据团队效能瓶颈’往往并非源于技术栈落后,而是组织层面对数据能力的封装方式失当——过度依赖统一建模、长链路协作和模糊交付标准。可组合型数据团队(Composable Data Teams)作为一种面向工程落地的新型组织范式,其本质是通过明确定义的输入/输出契约、标准化能力角色与轻量接口协议,实现数据服务能力的可验证、可替换与可计量。它不颠覆现有Flink/Trino/Airflow等技术底座,而是在其上构建一层‘能力治理层’,让分析师、算法工程师、业务方能基于契约直接消费

weixin_33766168的博客 447

动态二维码革命:Dub如何重新定义链接归因与营销追踪

在当今数字化营销环境中,二维码早已超越了简单的网址跳转功能。Dub作为开源的链接归因平台,通过其动态二维码技术为营销团队和开发者提供了全新的链接管理解决方案。如果你正在寻找一个能够将线下流量精准转化为线上用户行为数据的工具,Dub的动态二维码功能正是你需要的答案。 ## 为什么传统二维码已经过时? 传统的静态二维码存在几个致命缺陷:一旦生成就无法修改目标链接、缺乏用户行为追踪、无法进行A/B测

gitblog_00961的博客 462

Launcher3 数据库初始化分析

一.初始化创建launcher.db数据库,数据库里创建了两张表,分别是favorites和workspaceScrrens。 1.其表结构为:   2.内容为,举例: 3.字段含义:  _id:用于标识区分各个应用图标,是表favorites的主键,当添加数据时通过generateNewId使_id值增加。     title:在WorkSpace(HotSeat中一...

yuemingxingxing的博客 1938

重新定义游戏辅助:Aimmy AI瞄准系统的架构解析与实践指南

在快节奏的射击游戏中,精准的瞄准往往是决定胜负的关键。然而,对于许多玩家来说,由于身体条件、反应速度或设备限制,实现理想的瞄准表现并非易事。Aimmy作为一个基于AI技术的瞄准辅助系统,为这一挑战提供了创新的解决方案。通过DirectML、ONNX和YOLOv8的深度整合,这款工具不仅提升了瞄准精度,更在性能和兼容性方面树立了新的标杆。 ## 技术架构:AI瞄准系统的核心引擎 Aimmy的技术

gitblog_00094的博客 525

SQL实战优化四层防御体系:从查询逻辑到窗口函数

SQL是数据处理的核心语言,其执行效率直接取决于查询逻辑的分层设计与底层原理理解。数据库按FROM→WHERE→GROUP BY→HAVING顺序逐层过滤和聚合数据,每一层都承担特定的数据边界守卫职责;窗口函数则突破传统GROUP BY限制,实现行级计算与全局分析的统一。掌握索引选择性、日期范围查询替代函数截取、NULL显式处理等关键技术,能显著规避全表扫描、临时表膨胀与死锁等高频性能陷阱。本文聚焦真实业务场景中的SQL优化实践,覆盖电商复购分析、用户留存建模、SaaS客户分层等典型应用,帮助分析师与工程师

weixin_30340617的博客 523

Python super()函数详解:从MRO到多重继承的协作式设计

在面向对象编程中,方法解析顺序(MRO)是理解继承机制的核心概念,它决定了在多重继承场景下方法查找的路径。Python通过C3线性化算法实现MRO,有效解决了菱形继承等经典问题。基于MRO的super()函数提供了一种动态代理机制,能够按照解析顺序将方法调用委托给下一个类,其技术价值在于维护了初始化链的完整性,避免了父类方法被重复调用或跳过。这一机制在构建可扩展的插件系统、Mixin模式等应用场景中尤为重要,是实现协作式多重继承的关键。本文通过具体案例剖析了super()在Python类设计中的实际应用,特

weixin_30410119的博客 311

LangChain Deep Agents 架构解析:从函数调用到AI操作系统内核的组装逻辑

在AI应用开发领域,智能体(Agent)已成为连接大语言模型(LLM)与真实世界任务的关键技术架构。其核心原理在于通过规划、决策与工具调用的闭环,赋予模型执行复杂多步任务的能力。这种架构的技术价值在于将LLM的认知能力与外部工具的功能性相结合,实现了从“对话”到“行动”的跨越,极大地扩展了AI的应用边界。典型的应用场景包括自动化工作流、数据分析助手、智能客服系统等。本文聚焦于LangChain框架中的Deep Agents实现,特别是其核心组装函数 `create_deep_agent`。该函数并非简单的A

weixin_30753873的博客 381

Android 百度推送实现

今天将前些日子许下的百度推送wan

起猿的专栏 1793
上一篇: 第一篇 jdk1.7安装与java环境变量配置
下一篇: 重新组织函数--Inline Method(内联函数)
HDPCOMEON
博客等级 码龄15年 1粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值