範例證明ChatGPT對普通程式設計師真有很大影響!

2023-03-17 18:00:45

本篇文章給大家帶來了關於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

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 框架 中的 Illuminate\Contracts\Validation\Validator 介面,這樣就可以方便地與 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對於我的提問, 都給到了一個相對合適的回答

雖然這些程式碼不可能直接運用到實際專案中, 但也是給了我們一些思路, 去如何實現

以上範例中的三個版本答案像我這樣的菜鳥可能只能去想到前兩種方式去解決

ChatGPT相當於可以給我一些新的方法思路去解決問題, 或者自己不知道的方式思路

以後要是對某些功能沒有思路的話, 不如我們問問 ChatGPT 吧~

推薦學習:《》

以上就是範例證明ChatGPT對普通程式設計師真有很大影響!的詳細內容,更多請關注TW511.COM其它相關文章!