この記事では、ChatGPT に関する関連知識をお届けします。主に、一般のプログラマーに対する ChatGPT の影響や助けを証明するために例を使用する方法について説明します。興味のある方は以下をご覧ください。皆様のお役に立てれば幸いです。
コミュニティで質問を拝見しました。次のような判定ロジックをエレガントに記述する方法を聞きたいです:
(かなり多くの判定があることがわかります)見てください)腐植酸含量 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 弹出错误提示。ログイン後にコピー游离氨基酸 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,高于则有错误提示)ログイン後にコピーこれを思い返してみると、私はいつも
ChatGPT
にそれが同じくらい素晴らしいかどうかを尋ねていました。
そこで、元の質問をChatGPT
に送信したところ、次のような答えが得られました:
(私のネットワークはそれほど安定していないため、途中でネットワークが切断されたとよく言われる回答なので、例の一部のみを渡します)
ChatGPT 回答バージョン 1.1
Laravel フレームワークでは、フォームバリデーターを使用して条件を検証できます。具体的には、実装手順は次のとおりです。
#カスタム検証ルールの作成
php Artisan make:rule コマンドを使用してカスタム検証ルール クラスを作成できます。このカスタム検証ルール クラスは、
Illuminate\Contracts\Validation\Rule インターフェイスを実装し、その中に検証ルールのロジックを記述する必要があります。
たとえば、肥料条件を検証するために、
FertilizerRule という名前のカスタム検証ルール クラスを作成できます。
$ php artisan make:rule FertilizerRule
FertilizerRule クラスでは、## を実装できます。 #passes
メソッドを検証します。検証が成功した場合は true
を返し、それ以外の場合は false
を返します: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar: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.';
}
}</pre><div class="contentsignin">ログイン後にコピー</div></div>
クラスでは、質問の要件に従って肥料条件の検証ロジックを作成できます。以下は一例です。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"><?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class FertilizerRule implements Rule
{
public function passes($attribute, $value)
{
// 验证腐植酸含量
if (!isset($value[&#39;humic_acid&#39;]) || $value[&#39;humic_acid&#39;] < 30) {
return false;
}
// 验证大量元素含量
$total_npk = $value[&#39;nitrogen&#39;] + $value[&#39;phosphorus&#39;] + $value[&#39;potassium&#39;];
if ($total_npk < 200) {
return false;
}
if ($value[&#39;nitrogen&#39;] < 70 || $value[&#39;phosphorus&#39;] < 70 || $value[&#39;potassium&#39;] < 60) {
return false;
}
// 验证至少包括两种元素,单一元素净含量不低于 20 g/L
$count = 0;
foreach ([&#39;nitrogen&#39;, &#39;phosphorus&#39;, &#39;potassium&#39;] as $element) {
if ($value[$element] >= 20) {
$count++;
}
}
if ($count < 2) {
return false;
}
// 验证游离氨基酸含量
if (!isset($value[&#39;amino_acid&#39;]) || $value[&#39;amino_acid&#39;] < 100) {
return false;
}
// 验证微量元素含量
$total_trace = 0;
$trace_elements = [&#39;iron&#39;, &#39;zinc&#39;, &#39;boron&#39;, &#39;copper&#39;, &#39;manganese&#39;, &#39;molybdenum&#39;];
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 ||
//...代码不完整</pre><div class="contentsignin">ログイン後にコピー</div></div>
##私: その気はありません エレガントすぎて、if が多すぎて、あまり明確ではありません。最適化してください
ChatGPT 回答バージョン 1.2
はい、このコードには多くの if ステートメントが含まれているため、コードを読みにくく、保守しにくくなっています。このコードを複数の関数に分割し、それぞれが 1 つの特定の条件のみを処理する役割を担うようにすることをお勧めします。これにより、コードがより明確になり、読みやすく、保守しやすくなります。 可能な最適化は次のとおりです:
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; }
さて、検証ロジックを 4 つの独立した関数に分割し、それぞれが特定の条件の処理に焦点を当てました。これにより、コードがより簡潔になり、理解しやすくなります。
あなたは見ることができます
ChatGPT私の質問によると、この問題を解決するために関数を使用するように変更しました
ChatGPT 回答バージョン1.3引き続き質問します。
私: まだエレガントとは言えません。laravel フレームワークを使用し、責任チェーン設計パターンを使用してこのリクエストを設計してください
それでは、Laravel フレームワークと責任連鎖設計パターンを使用してこの要件を設計する方法を説明しましょう。 まず、各条件が満たされているかどうかを検証するバリデーター クラスを定義する必要があります。このクラスは、Laravel フレームワークに Illuminate\Contracts\Validation\Validator インターフェイスを実装できるため、Laravel の組み込みバリデータ コンポーネントと簡単に統合できます。
次に、抽象基本クラス Validatable を定義できます。これは、入力値が指定された条件を満たしているかどうかを検証する抽象メソッド validate を定義します。各条件に基づいて特定のバリデータ クラスを定義でき、これらのクラスは Validatable を継承し、特定の検証のための 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
彼らは私の質問に対して比較的適切な答えをくれました。 もし私が将来の特定の機能についてはわかりません アイデアについては、 推奨学習: 「laravel ビデオ チュートリアル 」 これらのコードは実際のプロジェクトに直接適用することはできませんが、3 つのコードを実装する方法など、いくつかのアイデアも提供してくれました。上記の例の答えのバージョンは何ですか? 私のような初心者は、問題を解決する最初の 2 つの方法しか思いつかないかもしれません。
ChatGPT
これは、問題を解決するための新しい方法やアイデア、または私の知らない方法やアイデアを私に提供することに相当します。ChatGPT
~
以上がChatGPT が一般のプログラマーに大きな影響を与えることは、例によって証明されています。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。