ChatGPT が一般のプログラマーに大きな影響を与えることは、例によって証明されています。

藏色散人
リリース: 2023-03-17 15:53:04
転載
1507 人が閲覧しました

この記事では、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 フレームワークでは、フォームバリデーターを使用して条件を検証できます。具体的には、実装手順は次のとおりです。

  • #カスタム検証ルールの作成

#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>

    検証ロジックの作成
FertilizerRule

クラスでは、質問の要件に従って肥料条件の検証ロジックを作成できます。以下は一例です。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">&lt;?php namespace App\Rules; use Illuminate\Contracts\Validation\Rule; class FertilizerRule implements Rule { public function passes($attribute, $value) { // 验证腐植酸含量 if (!isset($value[&amp;#39;humic_acid&amp;#39;]) || $value[&amp;#39;humic_acid&amp;#39;] &lt; 30) { return false; } // 验证大量元素含量 $total_npk = $value[&amp;#39;nitrogen&amp;#39;] + $value[&amp;#39;phosphorus&amp;#39;] + $value[&amp;#39;potassium&amp;#39;]; if ($total_npk &lt; 200) { return false; } if ($value[&amp;#39;nitrogen&amp;#39;] &lt; 70 || $value[&amp;#39;phosphorus&amp;#39;] &lt; 70 || $value[&amp;#39;potassium&amp;#39;] &lt; 60) { return false; } // 验证至少包括两种元素,单一元素净含量不低于 20 g/L $count = 0; foreach ([&amp;#39;nitrogen&amp;#39;, &amp;#39;phosphorus&amp;#39;, &amp;#39;potassium&amp;#39;] as $element) { if ($value[$element] &gt;= 20) {                 $count++;             }         }         if ($count &lt; 2) { return false; } // 验证游离氨基酸含量 if (!isset($value[&amp;#39;amino_acid&amp;#39;]) || $value[&amp;#39;amino_acid&amp;#39;] &lt; 100) { return false; } // 验证微量元素含量 $total_trace = 0; $trace_elements = [&amp;#39;iron&amp;#39;, &amp;#39;zinc&amp;#39;, &amp;#39;boron&amp;#39;, &amp;#39;copper&amp;#39;, &amp;#39;manganese&amp;#39;, &amp;#39;molybdenum&amp;#39;]; foreach ($trace_elements as $element) { if (isset($value[$element])) { $total_trace += $value[$element]; } } if (count(array_filter($value, function ($v) { return $v &gt;= 0.5; })) &lt; 1 || $total_trace &lt; 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 つの独立した関数に分割し、それぞれが特定の条件の処理に焦点を当てました。これにより、コードがより簡潔になり、理解しやすくなります。

最後に、これらの関数を結合し、validate 関数で使用して入力値を検証します。入力が不正な場合は false を返し、エラーメッセージを出力します。それ以外の場合は true を返します。

ここでのエラー プロンプトはコメントでマークされており、実際には Laravel フレームワークが提供するエラー処理メカニズムを通じて出力される必要があることに注意してください。

あなたは見ることができます

ChatGPT

私の質問によると、この問題を解決するために関数を使用するように変更しました引き続き質問します。 私: まだエレガントとは言えません。laravel フレームワークを使用し、責任チェーン設計パターンを使用してこのリクエストを設計してください

ChatGPT 回答バージョン1.3

それでは、Laravel フレームワークと責任連鎖設計パターンを使用してこの要件を設計する方法を説明しましょう。 まず、各条件が満たされているかどうかを検証するバリデーター クラスを定義する必要があります。このクラスは、Laravel フレームワークに Illuminate\Contracts\Validation\Validator インターフェイスを実装できるため、Laravel の組み込みバリデータ コンポーネントと簡単に統合できます。

次に、抽象基本クラス Validatable を定義できます。これは、入力値が指定された条件を満たしているかどうかを検証する抽象メソッド validate を定義します。各条件に基づいて特定のバリデータ クラスを定義でき、これらのクラスは Validatable を継承し、特定の検証のための validate メソッドを実装します。

最後に、責任連鎖パターンを使用してこれらのバリデーター クラスを編成し、入力値を順番に検証することができます。各バリデーター クラスは、次のバリデーター クラスのインスタンスを保持する次の属性を設定できます。 validate メソッドでは、現在のバリデーターが検証に失敗した場合、次のバリデーターの validate メソッドが呼び出され、すべてのバリデーターが検証されるか 1 つのバリデーターが失敗するまで繰り返されます。

以下は、フミン酸含有量とマクロ要素含有量の 2 つの条件を検証するためのサンプル コードです。

<?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

彼らは私の質問に対して比較的適切な答えをくれました。これらのコードは実際のプロジェクトに直接適用することはできませんが、3 つのコードを実装する方法など、いくつかのアイデアも提供してくれました。上記の例の答えのバージョンは何ですか? 私のような初心者は、問題を解決する最初の 2 つの方法しか思いつかないかもしれません。

ChatGPTこれは、問題を解決するための新しい方法やアイデア、または私の知らない方法やアイデアを私に提供することに相当します。

もし私が将来の特定の機能についてはわかりません アイデアについては、ChatGPT~

推奨学習: 「laravel ビデオ チュートリアル

以上がChatGPT が一般のプログラマーに大きな影響を与えることは、例によって証明されています。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:learnku.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!