详细介绍优化函数的构成_PHP教程
下面介绍了几种优化函数:
1. Extract Method (提炼函数)
解释:
如果发现一个函数的代码很长, 很可能的一种情况是这个函数做了很多事情, 找找看函数中有没有注释, 往往注释都是为了解释下面一块代码做的什么事情, 可以考虑将这块代码提炼(Extract)成一个独立的函数.
这样做的好处不言而喻, 是面向对象五大基本原则中的单一职责原则 (Single Responsibility Principle), 比较长的函数被拆分成一个个小函数, 将有利于代码被复用.
冲动前:
<ol class="dp-c"> <li class="alt"><span><span class="keyword">public</span><span> void Print(Employee employee) </span></span></li> <li><span>{ </span></li> <li class="alt"> <span class="comment">//print employee's information </span><span> </span> </li> <li> <span>Console.WriteLine(</span><span class="string">"Name:"</span><span> + employee.Name); </span> </li> <li class="alt"> <span>Console.WriteLine(</span><span class="string">"Sex:"</span><span> + employee.Sex); </span> </li> <li> <span>Console.WriteLine(</span><span class="string">"Age:"</span><span> + employee.Age); </span> </li> <li class="alt"> <span class="comment">//print employee's salary </span><span> </span> </li> <li> <span>Console.WriteLine(</span><span class="string">"Salary:"</span><span> + employee.Salary); </span> </li> <li class="alt"> <span>Console.WriteLine(</span><span class="string">"Bonus:"</span><span> + employee.Bonus); </span> </li> <li><span>} </span></li> </ol>
冲动后:
<ol class="dp-c"> <li class="alt"><span><span class="keyword">public</span><span> void Print(Employee employee) </span></span></li> <li><span>{ </span></li> <li class="alt"> <span class="comment">//print employee's information </span><span> </span> </li> <li><span>PrintInfo(employee); </span></li> <li class="alt"> <span class="comment">//print employee's salary </span><span> </span> </li> <li><span>PrintSalary(employee); </span></li> <li class="alt"><span>} </span></li> <li> <span class="keyword">public</span><span> void PrintInfo(Employee employee) </span> </li> <li class="alt"><span>{ </span></li> <li> <span>Console.WriteLine(</span><span class="string">"Name:"</span><span> + employee.Name); </span> </li> <li class="alt"> <span>Console.WriteLine(</span><span class="string">"Sex:"</span><span> + employee.Sex); </span> </li> <li> <span>Console.WriteLine(</span><span class="string">"Age:"</span><span> + employee.Age); </span> </li> <li class="alt"><span>} </span></li> <li> <span class="keyword">public</span><span> void PrintSalary(Employee employee) </span> </li> <li class="alt"><span>{ </span></li> <li> <span>Console.WriteLine(</span><span class="string">"Salary:"</span><span> + employee.Salary); </span> </li> <li class="alt"> <span>Console.WriteLine(</span><span class="string">"Bonus:"</span><span> + employee.Bonus); </span> </li> <li><span>} </span></li> </ol>
2. Inline Method (将函数内联)
解释:
有些函数很短, 只有一两行, 而且代码的意图也非常明显, 这时可以考虑将这个函数干掉, 直接使用函数中的代码.物件中过多的方法会让人感到不舒服, 干掉完全不必要的函数后代码会更简洁.
冲动前:
<ol class="dp-c"> <li class="alt"><span><span class="keyword">public</span><span> bool IsDeserving(int score) </span></span></li> <li><span>{ </span></li> <li class="alt"> <span class="keyword">return</span><span> IsScoreMoreThanSixty(score); </span> </li> <li><span>} </span></li> <li class="alt"> <span class="keyword">public</span><span> bool IsScoreMoreThanSixty(int score) </span> </li> <li><span>{ </span></li> <li class="alt"> <span class="keyword">return</span><span> (score > 60); </span> </li> <li><span>} </span></li> </ol>
冲动后:
<ol class="dp-c"> <li class="alt"><span><span class="keyword">public</span><span> bool IsDeserving(int score) </span></span></li> <li><span>{ </span></li> <li class="alt"> <span class="keyword">return</span><span> (score > 60) ; </span> </li> <li><span>} </span></li> </ol>
3. Inline Temp (将临时变量内联)
解释:
如果有一个临时变量 (Temp)用来表示某个函数的返回值, 一般来说, 这样的做法挺好的. 但如果这个临时变量实在多余, 将这个临时变量内联之后毫不影响代码的阅读, 甚至这个临时变量妨碍了其它重构工作, 就应该将这个临时变量内联化.
把这个临时变量干掉的好处在于减少了函数的长度, 有时可以让其它重构工作更顺利的进行.
冲动前:
<ol class="dp-c"> <li class="alt"><span><span>int salary = employee.Salary; </span></span></li> <li> <span class="keyword">return</span><span> (salary > 10000); </span> </li> </ol>
冲动后:
<ol class="dp-c"> <li class="alt"><span><span class="keyword">return</span><span> (employee.Salary > 10000); </span></span></li> <li><span>Replace Temp With Query (用查询式代替临时变量) </span></li> </ol>
解释:
程序中有一个临时变量(Temp)用来保存某个表达式的计算结果, 将这个计算表达式提炼(Extract)到一个独立的函数(即查询式Query)中, 将这个临时变量所有被调用的地方换成对新函数(Query)的调用, 新函数还可以被其它函数使用.
好处在于减少函数长度, 增加代码复用率, 有利于代码进一步的重构. 并且注意 Replace Temp With Query 往往是 Extract Method 之前必不可少的步骤, 因为局部变量会使代码不太容易被提炼, 所以在进行类似的重构前可以将它们替换成查询式.
下面的这个例子不是很有必要使用Replace Temp With Query, 主要展示如何 Replace Temp With Query. 试想"冲动前"函数中有很多个代码块都使用到 totalPrice, 突然有一天我发现这个函数太长, 我需要将这一块块的代码提炼成单独的函数, 这样就需要将 totalPrice = price * num; 放到每一个提炼出来的函数中. 而如果原来函数中使用的是查询式, 就不存在这个问题. 如果查询式中的计算量很大, 也不建议使用 Replace Temp With Query.
冲动前:
<ol class="dp-c"> <li class="alt"><span><span class="keyword">public</span><span> double FinalPrice(double price, int num) </span></span></li> <li><span>{ </span></li> <li class="alt"><span>double totalPrice = price * num; </span></li> <li> <span class="keyword">if</span><span> (totalPrice > 100) </span> </li> <li class="alt"> <span class="keyword">return</span><span> totalPrice * 0.8; </span> </li> <li> <span class="keyword">else</span><span> </span> </li> <li class="alt"> <span class="keyword">return</span><span> totalPrice * 0.9; </span> </li> <li><span>} </span></li> </ol>
冲动后:
<ol class="dp-c"> <li class="alt"><span><span class="keyword">public</span><span> double FinalPrice(double price, int num) </span></span></li> <li><span>{ </span></li> <li class="alt"> <span class="keyword">if</span><span> (TotalPrice(price, num) > 100) </span> </li> <li> <span class="keyword">return</span><span> TotalPrice(price, num) * 0.8; </span> </li> <li class="alt"> <span class="keyword">else</span><span> </span> </li> <li> <span class="keyword">return</span><span> TotalPrice(price, num) * 0.9; </span> </li> <li class="alt"><span>} </span></li> <li> <span class="keyword">public</span><span> double TotalPrice(double price, int num) </span> </li> <li class="alt"><span>{ </span></li> <li> <span class="keyword">return</span><span> price * num; </span> </li> <li class="alt"><span>} </span></li> </ol>
5. Introduce Explaining Variable (引入可以理解的变量)
解释:
很多时候在条件逻辑表达式中, 很多条件令人难以理解它的意义, 为什么要满足这个条件? 不清楚. 可以使用Introduce Explaining Variable将每个条件子句提炼出来, 分别用一个恰当的临时变量名表示条件子句的意义.
好处在于增加了程序的可读性.
冲动前:
<ol class="dp-c"> <li class="alt"><span><span class="keyword">if</span><span>((operateSystem.Contains(</span><span class="string">"Windows"</span><span>))&& (browser.Contatins(</span><span class="string">"IE"</span><span>))) </span></span></li> <li><span>{ </span></li> <li class="alt"> <span> </span><span class="comment">//do something </span><span> </span> </li> <li><span>} </span></li> </ol>
冲动后:
<ol class="dp-c"> <li class="alt"><span><span>bool isWindowsOS = operateSystem.Contains(</span><span class="string">"Windows"</span><span>); </span></span></li> <li> <span>bool isIEBrowser = browser.Contatins(</span><span class="string">"IE"</span><span>); </span> </li> <li class="alt"> <span class="keyword">if</span><span> (isWindowsOS && isIEBrowser) </span> </li> <li><span>{ </span></li> <li class="alt"> <span class="comment">//do something </span><span> </span> </li> <li><span>} </span></li> </ol>
6. Split Temporary Variable (撇清临时变量)
解释:
例如代码中有个临时变量在函数上面某处表示长方形周长, 在函数下面被赋予面积, 也就是这个临时变量被赋值超过一次, 且表示的不是同一种量. 应该针对每次赋值, 分配一个独立的临时变量.
一个变量只应表示一种量, 否则会令代码阅读者感到迷惑.
冲动前:
<ol class="dp-c"> <li class="alt"><span><span>double temp = (width + height) * 2; </span></span></li> <li> <span class="comment">//do something </span><span> </span> </li> <li class="alt"><span>temp = width * height; </span></li> <li> <span class="comment">//do something </span><span> </span> </li> </ol>
冲动后:
<ol class="dp-c"> <li class="alt"><span><span>double perimeter = (width + height) * 2; </span></span></li> <li> <span class="comment">//do something </span><span> </span> </li> <li class="alt"><span>double area = width * height; </span></li> <li> <span class="comment">//do something </span><span> </span> </li> </ol>
7. Remove Assignments to Parameters (消除对参数的赋值操作)
解释:
传入参数分"传值"和"传址"两种, 如果是"传址", 在函数中改变参数的值无可厚非, 因为我们就是想改变原来的值. 但如果是"传值", 在代码中为参数赋值, 就会令人产生疑惑. 所以在函数中应该用一个临时变量代替这个参数, 然后对这个临时变量进行其它赋值操作.
冲动前:
<ol class="dp-c"> <li class="alt"><span><span class="keyword">public</span><span> double FinalPrice(double price, int num) </span></span></li> <li><span>{ </span></li> <li class="alt"><span>price = price * num; </span></li> <li> <span class="comment">//other calculation with price </span><span> </span> </li> <li class="alt"> <span class="keyword">return</span><span> price; </span> </li> <li><span>} </span></li> </ol>
冲动后:
<ol class="dp-c"> <li class="alt"><span><span class="keyword">public</span><span> double FinalPrice(double price, int num) </span></span></li> <li><span>{ </span></li> <li class="alt"><span>double finalPrice = price * num; </span></li> <li> <span class="comment">//other calculation with finalPrice </span><span> </span> </li> <li class="alt"> <span class="keyword">return</span><span> finalPrice; </span> </li> <li><span>} </span></li> </ol>
8. Replace Method with Method Object (用函数物件代替函数)
解释:
冲动的写下一行行代码后, 突然发现这个函数变得非常大, 而且由于这个函数包含了很多局部变量, 使得无法使用 Extract Method, 这时 Replace Method with Method Object 就起到了杀手锏的效果. 做法是将这个函数放入一个单独的物件中, 函数中的临时变量就变成了这个物件里的值域 (field).
冲动前:
<ol class="dp-c"> <li class="alt"><span><span class="keyword">class</span><span> Bill </span></span></li> <li><span>{ </span></li> <li class="alt"> <span class="keyword">public</span><span> double FinalPrice() </span> </li> <li><span>{ </span></li> <li class="alt"><span>double primaryPrice; </span></li> <li><span>double secondaryPrice; </span></li> <li class="alt"><span>double teriaryPrice; </span></li> <li> <span class="comment">//long computation </span><span> </span> </li> <li class="alt"><span>... </span></li> <li><span>} </span></li> <li class="alt"><span>} </span></li> </ol>
冲动后:
<ol class="dp-c"> <li class="alt"><span><span class="keyword">class</span><span> Bill </span></span></li> <li><span>{ </span></li> <li class="alt"> <span class="keyword">public</span><span> double FinalPrice() </span> </li> <li><span>{ </span></li> <li class="alt"> <span class="keyword">return</span><span> </span><span class="keyword">new</span><span> PriceCalculator(this).compute(); </span> </li> <li><span>} </span></li> <li class="alt"><span>} </span></li> <li> <span class="keyword">class</span><span> PriceCalculator </span> </li> <li class="alt"><span>{ </span></li> <li><span>double primaryPrice; </span></li> <li class="alt"><span>double secondaryPrice; </span></li> <li><span>double teriaryPrice; </span></li> <li class="alt"> <span class="keyword">public</span><span> PriceCalculator(Bill bill) </span> </li> <li><span>{ </span></li> <li class="alt"> <span class="comment">//initial </span><span> </span> </li> <li><span>} </span></li> <li class="alt"> <span class="keyword">public</span><span> double compute() </span> </li> <li><span>{ </span></li> <li class="alt"> <span class="comment">//computation </span><span> </span> </li> <li><span>} </span></li> <li class="alt"><span>} </span></li> </ol>
9. Substitute Algorithm (替换算法)
解释:
有这么一个笑话:
某跨国日化公司, 肥皂生产线存在包装时可能漏包肥皂的问题, 肯定不能把空的肥皂盒卖给顾客, 于是该公司总裁命令组成了以博士牵头的专家组对这个问题进行攻关, 该研发团队使用了世界上最高精尖的技术 (如红外探测, 激光照射等), 在花费了大量美金和半年的时间后终于完成了肥皂盒检测系统, 探测到空的肥皂盒以后, 机械手会将空盒推出去. 这一办法将肥皂盒空填率有效降低至5%以内, 问题基本解决.
而某乡镇肥皂企业也遇到类似问题, 老板命令初中毕业的流水线工头想办法解决之, 经过半天的思考, 该工头拿了一台电扇到生产线的末端对着传送带猛吹, 那些没有装填肥皂的肥皂盒由于重量轻就都被风吹下去了...
这个笑话可以很好的解释 Substitute Algorithm, 对于函数中复杂的算法, 尽量想办法将这个算法简单化, 从而达到与之前同样甚至更好的效果.
本文链接:

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Go 언어는 클로저와 리플렉션이라는 두 가지 동적 함수 생성 기술을 제공합니다. 클로저는 클로저 범위 내의 변수에 대한 액세스를 허용하며 리플렉션은 FuncOf 함수를 사용하여 새 함수를 생성할 수 있습니다. 이러한 기술은 HTTP 라우터를 사용자 정의하고 고도로 사용자 정의 가능한 시스템을 구현하며 플러그 가능한 구성 요소를 구축하는 데 유용합니다.

C++ 함수 이름 지정에서는 가독성을 높이고 오류를 줄이며 리팩토링을 용이하게 하기 위해 매개변수 순서를 고려하는 것이 중요합니다. 일반적인 매개변수 순서 규칙에는 작업-객체, 개체-작업, 의미론적 의미 및 표준 라이브러리 준수가 포함됩니다. 최적의 순서는 함수의 목적, 매개변수 유형, 잠재적인 혼동 및 언어 규칙에 따라 달라집니다.

효율적이고 유지 관리 가능한 Java 함수를 작성하는 핵심은 단순함을 유지하는 것입니다. 의미 있는 이름을 사용하세요. 특별한 상황을 처리합니다. 적절한 가시성을 사용하십시오.

1. SUM 함수는 열이나 셀 그룹의 숫자를 합하는 데 사용됩니다(예: =SUM(A1:J10)). 2. AVERAGE 함수는 열이나 셀 그룹에 있는 숫자의 평균을 계산하는 데 사용됩니다(예: =AVERAGE(A1:A10)). 3. COUNT 함수, 열이나 셀 그룹의 숫자나 텍스트 수를 세는 데 사용됩니다. 예: =COUNT(A1:A10) 4. IF 함수, 지정된 조건을 기반으로 논리적 판단을 내리고 결과를 반환하는 데 사용됩니다. 해당 결과.

시간 복잡도는 입력 크기를 기준으로 알고리즘의 실행 시간을 측정합니다. C++ 프로그램의 시간 복잡성을 줄이는 팁에는 데이터 저장 및 관리를 최적화하기 위한 적절한 컨테이너(예: 벡터, 목록) 선택이 포함됩니다. Quick Sort와 같은 효율적인 알고리즘을 활용하여 계산 시간을 단축합니다. 여러 작업을 제거하여 이중 계산을 줄입니다. 불필요한 계산을 피하려면 조건부 분기를 사용하세요. 이진 검색과 같은 더 빠른 알고리즘을 사용하여 선형 검색을 최적화합니다.

2024년은 AI 휴대폰 원년이다. AI 스마트 기술을 탑재해 휴대폰을 더욱 효율적이고 편리하게 사용할 수 있는 휴대폰이 늘어나고 있다. 최근 연초 출시된 갤럭시 S24 시리즈에서는 제너레이티브 AI 경험이 다시 한 번 향상됐다. 자세한 기능 소개는 아래에서 살펴보자. 1. 생성적 AI의 강력한 강화 Samsung Galaxy S24 시리즈는 Galaxy AI의 강화를 통해 많은 지능형 애플리케이션을 제공했습니다. 이러한 기능은 Samsung One UI6.1과 긴밀하게 통합되어 사용자가 언제든지 편리하고 지능적인 경험을 얻을 수 있습니다. 휴대전화의 성능과 사용 편의성을 향상시킵니다. 갤럭시 S24 시리즈가 개척한 원 앤 검색 기능은 사용자가 길게 누르기만 하면 되는 기능 중 하나입니다.

C++의 예외 처리는 특정 오류 메시지, 상황별 정보를 제공하고 오류 유형에 따라 사용자 지정 작업을 수행하는 사용자 지정 예외 클래스를 통해 향상될 수 있습니다. 특정 오류 정보를 제공하려면 std::Exception에서 상속된 예외 클래스를 정의하세요. 사용자 정의 예외를 발생시키려면 throw 키워드를 사용하십시오. try-catch 블록에서 Dynamic_cast를 사용하여 발견된 예외를 사용자 지정 예외 유형으로 변환합니다. 실제 경우 open_file 함수는 FileNotFoundException 예외를 발생시킵니다. 예외를 포착하고 처리하면 보다 구체적인 오류 메시지가 제공될 수 있습니다.

빠른 점수 조회 도구는 학생과 학부모에게 더욱 편리함을 제공합니다. 인터넷의 발달로 점점 더 많은 교육 기관과 학교에서 온라인 점수 확인 서비스를 제공하기 시작했습니다. 자녀의 학업 진행 상황을 쉽게 추적할 수 있도록 이 기사에서는 일반적으로 사용되는 몇 가지 온라인 점수 확인 플랫폼을 소개합니다. 1. 편의성 - 학부모는 온라인 점수체크 플랫폼을 통해 언제 어디서나 자녀의 시험점수를 확인할 수 있습니다. 부모는 컴퓨터나 휴대폰에서 해당 온라인 점수체크 플랫폼에 로그인하여 언제든지 편리하게 자녀의 시험점수를 확인할 수 있습니다. 직장에서든 외출 중이든 인터넷 연결이 있는 한, 부모는 자녀의 학습 상태를 파악하고 자녀에게 목표에 맞는 지도와 도움을 제공할 수 있습니다. 2. 다양한 기능 – 점수 조회 외에도 강좌 일정, 시험 준비 등의 정보에 대한 다양한 온라인 검색 기능을 제공합니다.
