本篇文章給大家?guī)砹岁P(guān)于chatgpt的相關(guān)知識(shí),其中主要跟大家聊一聊我是如何用一個(gè)例子來證明chatgpt對(duì)我們普通程序員的影響或幫助?感興趣的朋友下面一起來看一下吧,希望對(duì)大家有幫助。
剛剛我看到社區(qū)里有一個(gè)提問, 想問如何優(yōu)雅的寫出以下的判斷邏輯: (看的出來判斷邏輯還是挺多的不需要細(xì)看)腐植酸含量?30?g/L(不低于?30?g/L)(右邊有?+-?鍵,可以增加或減少,但凈含量不低于?30?g/L)。大量元素含量(合計(jì)不低于?200?g/L):氮?70?g/L?(下邊有兩個(gè)選擇,UAN?或氮,每個(gè)健右邊有?+-?鍵,可以增加或減少,下同),?磷?70?g/L?(下邊有兩個(gè)選擇,磷酸一銨或磷酸二銨,每個(gè)健右邊有?+-?鍵,可以增加或減少,下同),鉀?60?g/L?(下邊有四個(gè)選擇,氯化鉀、硫酸鉀、硝酸鉀或磷酸二氫鉀,每個(gè)健右邊有?+-?鍵,可以增加或減少,下同)。至少包括兩種元素,單一元素凈含量不低于?20?g/L,氮、磷、鉀三個(gè)相加不能低于?200?g/L,低于?200?g/L?彈出錯(cuò)誤提示。游離氨基酸?100?g/L(不低于?100?g/L)(右邊有?+-?鍵,可以增加或減少,但凈含量不低于?100?g/L),微量元素(不低于?20?g/L):鐵?4?g/L?(每個(gè)右邊有?+-?鍵,可以增加或減少,至少包括?1?種微量元素,6?種元素凈含量總和不低于?20?g/L,低于則有錯(cuò)誤提示。若添加任一微量元素,不低于?0.5?g/L,低于則有錯(cuò)誤提示)、鋅?4g/L、硼?4g/L、銅?4g/L、錳?3.5g/L、鉬?0.5g/L(右邊有?+-?鍵,可以增加或減少,鉬凈含量不能高于?5?g/L,高于則有錯(cuò)誤提示)聯(lián)想到之前我總是會(huì)問問ChatGPT來看看它究竟有沒有網(wǎng)絡(luò)上傳的那么神.于是我將原問題發(fā)送給了ChatGPT得到了以下回答:(由于我的網(wǎng)絡(luò)沒有那么穩(wěn)定,得到的回答經(jīng)常會(huì)回答一半網(wǎng)絡(luò)就斷開了,所以只傳一部分例子)
ChatGPT回答1.1版本
在laravel框架中,可以使用表單驗(yàn)證器來實(shí)現(xiàn)對(duì)條件的驗(yàn)證,具體的實(shí)現(xiàn)步驟如下:
-
創(chuàng)建一個(gè)自定義驗(yàn)證規(guī)則
在Laravel框架中,可以使用 php artisan make:rule 命令來創(chuàng)建一個(gè)自定義的驗(yàn)證規(guī)則類。這個(gè)自定義的驗(yàn)證規(guī)則類需要實(shí)現(xiàn) IlluminateContractsValidationRule 接口,并在其中編寫驗(yàn)證規(guī)則的邏輯。
例如,可以創(chuàng)建一個(gè)名為 FertilizerRule 的自定義驗(yàn)證規(guī)則類,用于驗(yàn)證肥料條件:
$ php artisan make:rule FertilizerRule
在 FertilizerRule 類中,可以實(shí)現(xiàn) passes 方法來進(jìn)行驗(yàn)證,如果驗(yàn)證成功則返回 true,否則返回 false:
namespace AppRules; use IlluminateContractsValidationRule; class FertilizerRule implements Rule { public function passes($attribute, $value) { // TODO: 編寫肥料條件的驗(yàn)證邏輯 } public function message() { return 'The :attribute is invalid.'; } }
-
編寫驗(yàn)證邏輯
?在 FertilizerRule 類中,可以根據(jù)題目要求編寫肥料條件的驗(yàn)證邏輯。以下是一個(gè)示例:
<?php namespace AppRules; use IlluminateContractsValidationRule; class FertilizerRule implements Rule { public function passes($attribute, $value) { // 驗(yàn)證腐植酸含量 if (!isset($value['humic_acid']) || $value['humic_acid'] < 30) { return false; } // 驗(yàn)證大量元素含量 $total_npk = $value['nitrogen'] + $value['phosphorus'] + $value['potassium']; if ($total_npk < 200) { return false; } if ($value['nitrogen'] < 70 || $value['phosphorus'] < 70 || $value['potassium'] < 60) { return false; } // 驗(yàn)證至少包括兩種元素,單一元素凈含量不低于 20 g/L $count = 0; foreach (['nitrogen', 'phosphorus', 'potassium'] as $element) { if ($value[$element] >= 20) { $count++; } } if ($count < 2) { return false; } // 驗(yàn)證游離氨基酸含量 if (!isset($value['amino_acid']) || $value['amino_acid'] < 100) { return false; } // 驗(yàn)證微量元素含量 $total_trace = 0; $trace_elements = ['iron', 'zinc', 'boron', 'copper', 'manganese', 'molybdenum']; foreach ($trace_elements as $element) { if (isset($value[$element])) { $total_trace += $value[$element]; } } if (count(array_filter($value, function ($v) { return $v >= 0.5; })) < 1 || $total_trace < 20 || //...代碼不完整
離題目要求的優(yōu)雅好像還是挺有區(qū)別的, 于是我繼續(xù)追問
me : 感覺不太優(yōu)雅, 用到的if太多了,不太清晰明了,請(qǐng)優(yōu)化一下
ChatGPT回答1.2版本
是的,這個(gè)代碼確實(shí)有很多 if 語句,讓代碼變得難以閱讀和維護(hù)。我建議將這個(gè)代碼分解成多個(gè)函數(shù),每個(gè)函數(shù)只負(fù)責(zé)處理一個(gè)特定的條件。這樣可以讓代碼更加清晰明了,易于閱讀和維護(hù)。
下面是一個(gè)可能的優(yōu)化方案:
function validateHumicAcid($value) { return $value >= 30; } function validateMacroElements($nitrogen, $phosphorus, $potassium) { $sum = $nitrogen + $phosphorus + $potassium; return $sum >= 200 && $nitrogen >= 20 && $phosphorus >= 20 && $potassium >= 20; } function validateTraceElements($iron, $zinc, $boron, $copper, $manganese, $molybdenum) { $sum = $iron + $zinc + $boron + $copper + $manganese + $molybdenum; $atLeastOne = $iron >= 0 || $zinc >= 0 || $boron >= 0 || $copper >= 0 || $manganese >= 0 || $molybdenum >= 0; $atLeastSix = $sum >= 20; return $atLeastOne && $atLeastSix && $molybdenum <= 5; } function validateAminoAcids($value) { return $value >= 100; } function validate($humicAcid, $nitrogen, $phosphorus, $potassium, $iron, $zinc, $boron, $copper, $manganese, $molybdenum, $aminoAcids) { $isValid = true; if (!validateHumicAcid($humicAcid)) { $isValid = false; // 輸出錯(cuò)誤提示 } if (!validateMacroElements($nitrogen, $phosphorus, $potassium)) { $isValid = false; // 輸出錯(cuò)誤提示 } if (!validateTraceElements($iron, $zinc, $boron, $copper, $manganese, $molybdenum)) { $isValid = false; // 輸出錯(cuò)誤提示 } if (!validateAminoAcids($aminoAcids)) { $isValid = false; // 輸出錯(cuò)誤提示 } return $isValid; }
現(xiàn)在,我們已經(jīng)把驗(yàn)證邏輯分解成了四個(gè)獨(dú)立的函數(shù),每個(gè)函數(shù)都專注于處理一個(gè)特定的條件。這使得代碼變得更加簡潔和易于理解。
最后,我們把這些函數(shù)組合起來,并在 validate 函數(shù)中使用它們來驗(yàn)證輸入值。如果輸入無效,則返回 false 并輸出錯(cuò)誤提示。否則,返回 true。
需要注意的是,這里的錯(cuò)誤提示是通過注釋標(biāo)記的,實(shí)際上應(yīng)該通過 Laravel 框架提供的錯(cuò)誤處理機(jī)制來輸出。
可以看到ChatGPT根據(jù)我的提問改為了用函數(shù)的方式來解決這個(gè)問題
我來繼續(xù)追問:
me : 感覺還是不太優(yōu)雅,請(qǐng)用laravel框架并且用責(zé)任鏈設(shè)計(jì)模式來設(shè)計(jì)這次的要求
ChatGPT回答1.3版本
好的,我來為您展示如何用 Laravel 框架和責(zé)任鏈設(shè)計(jì)模式來設(shè)計(jì)這個(gè)要求。
?首先,我們需要定義一個(gè)驗(yàn)證器類,用于驗(yàn)證每一個(gè)條件是否滿足。該類可以實(shí)現(xiàn) Laravel 框架 ?中的 IlluminateContractsValidationValidator 接口,這樣就可以方便地與 Laravel 內(nèi)置的驗(yàn)證器組件集成。
接下來,我們可以定義一個(gè)抽象基類 Validatable,該類定義了一個(gè)抽象方法 validate,用于驗(yàn)證輸入的值是否滿足指定條件。我們可以根據(jù)每個(gè)條件定義一個(gè)具體的驗(yàn)證器類,這些類都繼承自 Validatable,并實(shí)現(xiàn) validate 方法,用于具體驗(yàn)證。
最后,我們可以使用責(zé)任鏈模式來組織這些驗(yàn)證器類,使其按順序依次驗(yàn)證輸入的值。每個(gè)驗(yàn)證器類可以設(shè)置一個(gè) next 屬性,用于保存下一個(gè)驗(yàn)證器類的實(shí)例。在 validate 方法中,如果當(dāng)前驗(yàn)證器驗(yàn)證失敗,則會(huì)調(diào)用下一個(gè)驗(yàn)證器的 validate 方法,以此類推,直到所有驗(yàn)證器都驗(yàn)證完畢或某一個(gè)驗(yàn)證器驗(yàn)證失敗為止。
下面是一個(gè)示例代碼,用于驗(yàn)證腐植酸含量和大量元素含量這兩個(gè)條件:
<?php namespace AppValidators; use IlluminateContractsValidationValidator; abstract class Validatable implements Validator { protected $next; public function setNext(Validatable $next) { $this->next = $next; return $next; } public function validate($attribute, $value, $parameters = [], $validator = null) { if ($this->condition($value)) { return true; } elseif ($this->next) { return $this->next->validate($attribute, $value, $parameters, $validator); } else { return false; } } abstract protected function condition($value); } class HumicAcidValidator extends Validatable { protected function condition($value) { return $value >= 30; } } class NitrogenValidator extends Validatable { protected function condition($value) { return $value >= 70; } } class PhosphorusValidator extends Validatable { protected function condition($value) { return $value >= 70; } } class PotassiumValidator extends Validatable { protected function condition($value) { return $value >= 60; } } class ValidatorChain implements Validator { protected $chain; public function __construct() { $this->chain = new HumicAcidValidator(); $this->chain->setNext(new NitrogenValidator()) ->setNext(new PhosphorusValidator()) ->setNext(new PotassiumValidator()); } public function validate($attribute, $value, $parameters = [], $validator = null) { return $this->chain->validate($attribute, $value, $parameters, $validator); } }
總結(jié)
可以看到ChatGPT對(duì)于我的提問, 都給到了一個(gè)相對(duì)合適的回答
雖然這些代碼不可能直接運(yùn)用到實(shí)際項(xiàng)目中, 但也是給了我們一些思路, 去如何實(shí)現(xiàn)
以上示例中的三個(gè)版本答案像我這樣的菜鳥可能只能去想到前兩種方式去解決
ChatGPT相當(dāng)于可以給我一些新的方法思路去解決問題, 或者自己不知道的方式思路
以后要是對(duì)某些功能沒有思路的話, 不如我們問問 ChatGPT 吧~
推薦學(xué)習(xí):《laravel視頻教程》