Dieser Artikel vermittelt Ihnen relevantes Wissen über ChatGPT. Es geht hauptsächlich darum, wie ich anhand eines Beispiels die Wirkung oder Hilfe von ChatGPT auf uns normale Programmierer beweise. Freunde, die interessiert sind, können einen Blick darauf werfen. Ich hoffe, es wird für alle hilfreich sein.
Gerade habe ich eine Frage in der Community gesehen. Ich möchte fragen, wie man die folgende Urteilslogik elegant schreiben kann:
(Man kann sehen, dass es ziemlich viel Urteilslogik gibt, man muss nicht genau hinschauen)腐植酸含量 30 g/L(不低于 30 g/L)(右边有 +- 键,可以增加或减少,但净含量不低于 30 g/L)。大量元素含量(合计不低于 200 g/L):氮 70 g/L (下边有两个选择,UAN 或氮,每个健右边有 +- 键,可以增加或减少,下同), 磷 70 g/L (下边有两个选择,磷酸一铵或磷酸二铵,每个健右边有 +- 键,可以增加或减少,下同),钾 60 g/L (下边有四个选择,氯化钾、硫酸钾、硝酸钾或磷酸二氢钾,每个健右边有 +- 键,可以增加或减少,下同)。至少包括两种元素,单一元素净含量不低于 20 g/L,氮、磷、钾三个相加不能低于 200 g/L,低于 200 g/L 弹出错误提示。Nach dem Login kopieren游离氨基酸 100 g/L(不低于 100 g/L)(右边有 +- 键,可以增加或减少,但净含量不低于 100 g/L),微量元素(不低于 20 g/L):铁 4 g/L (每个右边有 +- 键,可以增加或减少,至少包括 1 种微量元素,6 种元素净含量总和不低于 20 g/L,低于则有错误提示。若添加任一微量元素,不低于 0.5 g/L,低于则有错误提示)、锌 4g/L、硼 4g/L、铜 4g/L、锰 3.5g/L、钼 0.5g/L(右边有 +- 键,可以增加或减少,钼净含量不能高于 5 g/L,高于则有错误提示)Nach dem Login kopierenIch denke darüber nach, bevor ich immer
ChatGPT
ChatGPT
来看看它究竟有没有网络上传的那么神.
于是我将原问题发送给了ChatGPT
得到了以下回答:
(由于我的网络没有那么稳定,得到的回答经常会回答一半网络就断开了,所以只传一部分例子)
ChatGPT回答1.1版本
在Laravel框架中,可以使用表单验证器来实现对条件的验证,具体的实现步骤如下:
创建一个自定义验证规则
在Laravel框架中,可以使用 php artisan make:rule
命令来创建一个自定义的验证规则类。这个自定义的验证规则类需要实现 IlluminateContractsValidationRule
接口,并在其中编写验证规则的逻辑。
例如,可以创建一个名为 FertilizerRule
的自定义验证规则类,用于验证肥料条件:
$ php artisan make:rule FertilizerRule
在 FertilizerRule
类中,可以实现 passes
方法来进行验证,如果验证成功则返回 true
,否则返回 false
:
namespace App\Rules; use Illuminate\Contracts\Validation\Rule; class FertilizerRule implements Rule { public function passes($attribute, $value) { // TODO: 编写肥料条件的验证逻辑 } public function message() { return 'The :attribute is invalid.'; } }
编写验证逻辑
在 FertilizerRule
类中,可以根据题目要求编写肥料条件的验证逻辑。以下是一个示例:
<?php namespace App\Rules; use Illuminate\Contracts\Validation\Rule; class FertilizerRule implements Rule { public function passes($attribute, $value) { // 验证腐植酸含量 if (!isset($value['humic_acid']) || $value['humic_acid'] < 30) { return false; } // 验证大量元素含量 $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; } // 验证至少包括两种元素,单一元素净含量不低于 20 g/L $count = 0; foreach (['nitrogen', 'phosphorus', 'potassium'] as $element) { if ($value[$element] >= 20) { $count++; } } if ($count < 2) { return false; } // 验证游离氨基酸含量 if (!isset($value['amino_acid']) || $value['amino_acid'] < 100) { return false; } // 验证微量元素含量 $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 || //...代码不完整
离题目要求的优雅好像还是挺有区别的, 于是我继续追问
me : 感觉不太优雅, 用到的if太多了,不太清晰明了,请优化一下
ChatGPT回答1.2版本
是的,这个代码确实有很多 if 语句,让代码变得难以阅读和维护。我建议将这个代码分解成多个函数,每个函数只负责处理一个特定的条件。这样可以让代码更加清晰明了,易于阅读和维护。
下面是一个可能的优化方案:
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; // 输出错误提示 } if (!validateMacroElements($nitrogen, $phosphorus, $potassium)) { $isValid = false; // 输出错误提示 } if (!validateTraceElements($iron, $zinc, $boron, $copper, $manganese, $molybdenum)) { $isValid = false; // 输出错误提示 } if (!validateAminoAcids($aminoAcids)) { $isValid = false; // 输出错误提示 } return $isValid; }
现在,我们已经把验证逻辑分解成了四个独立的函数,每个函数都专注于处理一个特定的条件。这使得代码变得更加简洁和易于理解。
最后,我们把这些函数组合起来,并在 validate 函数中使用它们来验证输入值。如果输入无效,则返回 false 并输出错误提示。否则,返回 true。
需要注意的是,这里的错误提示是通过注释标记的,实际上应该通过 Laravel 框架提供的错误处理机制来输出。
可以看到
ChatGPT
根据我的提问改为了用函数的方式来解决这个问题
我来继续追问:
me : 感觉还是不太优雅,请用laravel框架并且用责任链设计模式来设计这次的要求
ChatGPT回答1.3版本
好的,我来为您展示如何用 Laravel 框架和责任链设计模式来设计这个要求。
首先,我们需要定义一个验证器类,用于验证每一个条件是否满足。该类可以实现 Laravel 框架 中的 IlluminateContractsValidationValidator 接口,这样就可以方便地与 Laravel 内置的验证器组件集成。
接下来,我们可以定义一个抽象基类 Validatable,该类定义了一个抽象方法 validate,用于验证输入的值是否满足指定条件。我们可以根据每个条件定义一个具体的验证器类,这些类都继承自 Validatable,并实现 validate 方法,用于具体验证。
最后,我们可以使用责任链模式来组织这些验证器类,使其按顺序依次验证输入的值。每个验证器类可以设置一个 next 属性,用于保存下一个验证器类的实例。在 validate 方法中,如果当前验证器验证失败,则会调用下一个验证器的 validate 方法,以此类推,直到所有验证器都验证完毕或某一个验证器验证失败为止。
下面是一个示例代码,用于验证腐植酸含量和大量元素含量这两个条件:
<?php namespace App\Validators; use Illuminate\Contracts\Validation\Validator; 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); } }
总结
可以看到ChatGPT
frage, um zu sehen, ob es genauso toll ist wie das Hochladen im Internet.Also habe ich die ursprüngliche Frage an
ChatGPT
gesendet >und habe die folgende Antwort erhalten:
(Da mein Netzwerk nicht so stabil ist, besagen die Antworten, die ich oft bekomme, dass das Netzwerk auf halbem Weg getrennt ist, daher sende ich nur einige Beispiele) 🎜ChatGPT-Antwortversion 1.1🎜 🎜🎜Im Laravel-Framework können Sie Formularvalidatoren verwenden, um Bedingungen zu überprüfen. Die spezifischen Implementierungsschritte lauten wie folgt: 🎜php artisan make:rule
verwenden, um eine benutzerdefinierte Validierungsregelklasse zu erstellen. Diese benutzerdefinierte Validierungsregelklasse muss die Schnittstelle IlluminateContractsValidationRule
implementieren und die Logik der Validierungsregeln darin schreiben. 🎜 Sie können beispielsweise eine benutzerdefinierte Validierungsregelklasse mit dem Namen FertilizerRule
zur Validierung von Düngebedingungen erstellen: 🎜rrreee🎜In der Klasse FertilizerRule
können Sie passes implementieren. code>-Methode zur Überprüfung. Wenn die Überprüfung erfolgreich ist, geben Sie <code>true
zurück, andernfalls geben Sie false
zurück: 🎜rrreeeFertilizerRule
können Sie Überprüfungslogik für Düngemittelbedingungen entsprechend den Fragenanforderungen schreiben. Das Folgende ist ein Beispiel: 🎜rrreee🎜🎜Es scheint, dass die Eleganz der Frage ganz anders ist, also habe ich weiter gefragt 🎜🎜🎜🎜ich: Es fühlt sich nicht sehr elegant an, es werden zu viele Wenns verwendet , es ist nicht sehr klar und prägnant, bitte optimieren Sie es. Ich würde vorschlagen, diesen Code in mehrere Funktionen aufzuteilen, von denen jede nur für die Behandlung einer bestimmten Bedingung verantwortlich ist. Dadurch wird der Code klarer und einfacher zu lesen und zu warten. 🎜 Hier ist eine mögliche Optimierung: 🎜rrreee🎜 Jetzt haben wir die Validierungslogik in vier separate Funktionen unterteilt, die sich jeweils auf die Behandlung einer bestimmten Bedingung konzentrieren. Dadurch wird der Code prägnanter und verständlicher. 🎜🎜Abschließend kombinieren wir diese Funktionen und verwenden sie in der Validierungsfunktion, um den Eingabewert zu validieren. Wenn die Eingabe ungültig ist, wird false zurückgegeben und eine Fehlermeldung ausgegeben. Andernfalls wird true zurückgegeben. 🎜🎜Es ist zu beachten, dass die Fehleraufforderungen hier durch Kommentare gekennzeichnet sind und tatsächlich über den vom Laravel-Framework bereitgestellten Fehlerbehandlungsmechanismus ausgegeben werden sollten. 🎜🎜🎜Sie können sehen🎜ChatGPT
🎜Nach meiner Frage habe ich es in eine Funktion geändert, um dieses Problem zu lösen🎜Ich werde weiterhin fragen:🎜🎜ich: Es fühlt sich bitte immer noch nicht sehr elegant an Verwenden Sie das Laravel-Framework und verwenden Sie das Chain-of-Responsibility-Designmuster, um diese Anforderung zu entwerfen diese Anforderung zu gestalten. 🎜 Zuerst müssen wir eine Validatorklasse definieren, um zu überprüfen, ob jede Bedingung erfüllt ist. Diese Klasse kann die IlluminateContractsValidationValidator-Schnittstelle im Laravel-Framework implementieren, sodass sie problemlos in die integrierte Validatorkomponente von Laravel integriert werden kann. 🎜🎜Als nächstes können wir eine abstrakte Basisklasse Validatable definieren, die eine abstrakte Validierungsmethode definiert, um zu überprüfen, ob der Eingabewert die angegebenen Bedingungen erfüllt. Wir können basierend auf jeder Bedingung eine bestimmte Validatorklasse definieren. Diese Klassen erben von Validatable und implementieren die Validierungsmethode für eine spezifische Überprüfung. 🎜🎜Schließlich können wir das Chain-of-Responsibility-Muster verwenden, um diese Validatorklassen so zu organisieren, dass sie die Eingabewerte der Reihe nach validieren. Jede Validatorklasse kann ein nächstes Attribut festlegen, das eine Instanz der nächsten Validatorklasse enthält. Wenn bei der Validierungsmethode die Validierung des aktuellen Validators fehlschlägt, wird die Validierungsmethode des nächsten Validators aufgerufen usw., bis alle Validatoren validiert wurden oder ein Validator ausfällt. 🎜🎜Das Folgende ist ein Beispielcode zur Überprüfung der beiden Bedingungen Huminsäuregehalt und Makroelementgehalt:🎜rrreee🎜🎜Zusammenfassung🎜🎜🎜Sie können sehen🎜ChatGPT
🎜Für meine Fragen sind beide A relativ passend Die Antwort wurde gegeben🎜🎜Obwohl diese Codes nicht direkt auf tatsächliche Projekte angewendet werden können, geben sie uns auch einige Ideen, wie man sie umsetzen kann🎜🎜Die Antworten auf die drei Versionen der obigen Beispiele können nur von einem Anfänger wie mir gelöst werden der ersten beiden Möglichkeiten, es zu lösen🎜ChatGPT
ChatGPT
相当于可以给我一些新的方法思路去解决问题, 或者自己不知道的方式思路
以后要是对某些功能没有思路的话, 不如我们问问 ChatGPT
Es ist gleichbedeutend damit, mir einige neue Methoden und Ideen zur Lösung von Problemen zu geben, oder Methoden und Ideen, die ich nicht kenne
Das obige ist der detaillierte Inhalt vonBeispiele beweisen, dass ChatGPT einen großen Einfluss auf normale Programmierer hat!. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!