• <td id="c1e2m"><strike id="c1e2m"></strike></td><acronym id="c1e2m"><strong id="c1e2m"></strong></acronym>

    <acronym id="c1e2m"><label id="c1e2m"></label></acronym>

    <td id="c1e2m"></td>

      <p id="c1e2m"><strong id="c1e2m"><xmp id="c1e2m"></xmp></strong></p>
        <td id="c1e2m"><ruby id="c1e2m"></ruby></td>
      1. <p id="c1e2m"></p>
        您的位置:首頁 >聚焦 >

        Copilot 與 ChatGPT,讓程序員如虎添翼 —— 讓 AI 們為我們打工!_世界頭條

        2022-12-18 14:33:10    來源:程序員客棧

        Copilot 來了,程序員會失業嗎?ChatGPT 又來了,程序員會失業嗎?程序員本來就焦慮,最近似乎越來越焦慮了。在 Copilot 問世時,我感覺自己退化成了工具人:《我退化成一個只會敲 Tab 鍵的工具人了!》。如今 ChatGPT 又來了,這次我是什么感覺呢?感覺真的 Google 和 StackOverflow 已經不好用了。


        【資料圖】

        不過,經過一段時間對 Copilot 的使用,我的心態已經平和了許多,不再擔心失業了?;仡^來看,其實,它們都是效率工具,它們不是要干掉程序員,而是更好地幫助程序員。眾所周知,程序員可以改變世界,那么,借助 Copilot 和 ChatGPT,程序員的自我感覺更棒了!可以更加肆無忌憚地在未知領域里自由探索了!

        探索 Vue

        前幾天,我開始對一個 Vue 項目做一些迭代優化,這是我第一次接觸 Vue 項目。我需要對該 Vue 項目進行保護,添加登錄功能,詳細過程見《使用 IdentityServer 保護 Vue 前端》。我在這一篇日志里提了一下,說自己參考 Vue 的官方文檔,給 Vue 應用添加的方法,在 vue-router 的導航守衛里,按照 vue-router 的官方文檔去拿這個方法,居然是 undefined!通過 Google 搜索了很久,都是這種官方文檔類似的說明(然而并不管用?。?,于是我去 StackOverflow 上提了這個問題:https://stackoverflow.com/questions/74769607/how-to-access-vues-methods-from-navigation-guard,這個問題到現在,也沒有其他人(除了我自己)回復。

        于是我抱著試一試的心理,在 ChatGPT 上問了一下,沒有想到立即得到了詳細的解答:

        它的思路是,將方法添加在 Vue 的 prototype 中,這樣,在導航守衛里就能使用 this關鍵字去訪問全局方法了!這真的是比 Google 好用呀!

        探索 Mybatis plus

        我對 Java 也不熟,它的生態中很多組件,我聽上去感覺就是拼寫錯誤。昨天在 Mybatis plus 上就栽了跟頭。事情是這樣的,我和同事們業余做了一個項目(有興趣一起來玩的同學們歡迎聯系哈),目前剛開始,正在做一個 3D 世界里的角色可以選擇自己的皮膚顏色的功能。

        https://brickverse.vercel.app/

        或者這個鏈接:https://brick.cat

        前端部署在 Vercel 上,后端部署在 Okteto 上。后端服務是一個 Java 項目,我在這個項目里添加了 UserPreference 這個數據表,用來保存用戶的偏好設置,詳細 api 文檔見:https://brickverse-user-service-gracewen1.cloud.okteto.net/doc.html#/brick/%E5%BD%93%E5%89%8D%E7%94%A8%E6%88%B7%E5%81%8F%E5%A5%BD%E7%AE%A1%E7%90%86/createOrUpdateUserPreferenceUsingPOST。

        用戶可以有很多設置,我的設想是每個用戶可以有多個 key-value 鍵值對,但同一個用戶,同一個 key,只能有一條記錄。為了簡單,就提供一個接口給到用戶添加或者更新偏好。我的設想是,對于同一個 userId, key,如果沒有記錄就添加,有的話,就更新 value。我對 Mybatis plus 不熟,但是在寫的過程中,點出了一個 saveOrUpdate 方法,就認為這正是我要的,保存或者更新嘛。我在 Flyway 腳本里將 userId 和 key 設置成唯一索引,心想,當我試著保存一個記錄時,首先嘗試插入,碰到已有記錄的錯誤時,該方法就轉而調用 update。

        CREATE TABLE `user_preference` (`id` bigint NOT NULL AUTO_INCREMENT,`user_id` varchar(100) NOT NULL,`key` varchar(100) NOT NULL,`value` varchar(10000) NOT NULL,`create_time` datetime DEFAULT NULL,`update_time` datetime DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `user_id_key` (`user_id`,`key`)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

        public boolean saveOrUpdatePreference(String userId, UserPreferenceDto dto) {var key = dto.getKey();var value = dto.getValue();UserPreference userPreference = new UserPreference();userPreference.setUserId(userId);userPreference.setKey(key);userPreference.setValue(value);return this.saveOrUpdate(userPreference);}

        沒想到,實際上,當想要更新這個 value 時,仍然報了唯一索引沖突錯誤,而沒有進行更新。這時,我才知道,這個 saveOrUpdate,在不傳入主鍵時,總是嘗試插入。這時我用 Google 搜索如何讓 saveOrUpdate 根據自定義查詢條件去判斷是否已存在呢?發現似乎只有國人在用 Mybatis Plus,找到的鏈接全是 csdn 對 saveOrUpdate 的泛泛簡介,沒有一篇文章講解高級用法。

        這時我抱著試一試的想法,去問了一下 ChatGPT,沒想到它立刻馬上給予了詳細的說明,不僅有代碼示例,還有溫馨提示,主要指出我的代碼問題在于調用 saveOrUpdate 時,沒有去數據庫里查詢已有記錄。

        你看,它給的代碼示例,在調用 saveOrUpdate 之前,先使用 QueryWrapper 去查詢了數據庫里的現有記錄,然后再設置值??吹竭@里我秒懂了,我需要在調用 saveOrUpdate 之前,根據 userId 和 key 來查詢一下數據庫中的記錄。這時,我想,能不能把這個查詢做為參數直接扔給 saveOrUpdate 呢?我試著在 saveOrUpdate 的第一個參數后加了一個逗號,這時, Copilot 就自動幫我補全了代碼,我一看,還正是我需要的條件呢!

        我按了一下 Tab 鍵,提交了這個改動:

        在 cicd 流水線跑完后,我再試了一次,重新選擇皮膚顏色,更新成功了!

        總結

        我感覺自己從此可以擺脫面向 Google 和 StackOverflow 編程的習慣了,轉而面向 ChatGPT 和 Copilot 編程。ChatGPT 和 Copilot,可以讓程序員在嘗試新的領域時,變得更加有效率。就像朋友圈有朋友留言說的,ChatGPT 和 Copilot 可以互相結對編程,讓 AI 們為我們打工!

        關鍵詞: 這個問題 感覺自己 就能使用

        相關閱讀

        欧美视频线路在线_欧美中文字幕在线中出观看_中年美女露比自慰交配a一级片免费播放_九九精品国中文字幕在线视频

      2. <td id="c1e2m"><strike id="c1e2m"></strike></td><acronym id="c1e2m"><strong id="c1e2m"></strong></acronym>

        <acronym id="c1e2m"><label id="c1e2m"></label></acronym>

        <td id="c1e2m"></td>

          <p id="c1e2m"><strong id="c1e2m"><xmp id="c1e2m"></xmp></strong></p>
            <td id="c1e2m"><ruby id="c1e2m"></ruby></td>
          1. <p id="c1e2m"></p>