• <em id="6vhwh"><rt id="6vhwh"></rt></em>

    <style id="6vhwh"></style>

    <style id="6vhwh"></style>
    1. <style id="6vhwh"></style>
        <sub id="6vhwh"><p id="6vhwh"></p></sub>
        <p id="6vhwh"></p>
          1. 国产亚洲欧洲av综合一区二区三区 ,色爱综合另类图片av,亚洲av免费成人在线,久久热在线视频精品视频,成在人线av无码免费,国产精品一区二区久久毛片,亚洲精品成人片在线观看精品字幕 ,久久亚洲精品成人av秋霞

            includefile(include什么意思)

            更新時間:2023-03-02 08:52:45 閱讀: 評論:0

            導讀

            Don Roberts提出的一條重構準則:

            第一次做某件事時只管去做;第二次做類似的事時會產生反感,但無論如何還是可以去做;第三次再做類似的事時,你就應該重構。

            編碼也是如此,當多次編寫類似的代碼時,我們需要考慮是否有一種方法能夠提高編碼速度。作者多年來致力于敏捷開發,總結了一套編碼的方法論,有助于程序員"快速、優質、高效"地進行編碼。

            方法1:手工編寫代碼

            大多數剛學習Java的程序員,都會懷著一種崇敬的儀式感,一字一句地在開發工具上敲出以下代碼:

            public class Test { public static void main(String[] args) { System.out.println("Hello world!"); }}

            沒錯,這就是經典的"Hello world",這也是大多數人手工編寫的第一個程序。

            手工編寫代碼,更能體現一個程序員的基本素質。有很多公司,都把上機編程考試作為面試的重要手段之一。面試者需要根據題目的要求,挑選一款熟悉的編程工具(比如Eclip),手工編寫代碼并調試運行通過。在整個過程中,不能通過網絡搜索答案,不能查看聯機幫助文檔,要求面試者必須手工編寫代碼,主要是考察面試者手工編寫代碼的能力——語法、函數、邏輯、思維、算法以及動手能力。

            手工編寫代碼,是一個優秀程序員必須具備的基礎能力。手工編寫代碼正如提筆寫文章,語法就是遣詞造句的方法、函數就是組成文章的詞句、類庫就是據經引典的掌故、架構就是行文表述的體裁、功能就是寫作文章的主旨、算法就是組織語言的邏輯……所以,只要掌握一門程序語言的語法、學習一堆基礎類庫的函數、引用一些所需的第三方類庫、選擇一款成熟穩定的架構、明確一下產品需求的功能、挑選一種實現邏輯的算法……手工編寫代碼就會像寫文章一樣手到擒來。

            方法2:復制粘貼代碼

            常言道:"熟讀唐詩三百首,不會作詩也會吟。"編碼也是同樣的道理,編碼的第一步就是模仿,簡單地說就是"抄代碼"——復制粘貼代碼。復制粘貼代碼是一門藝術,用好了編碼會事半功倍。但是,沒有檢驗過的東西,終究是不可全信的。當看到需要的代碼時,在復制粘貼前,我們都需要仔細研讀、認真思考、詳細甄別……很多東西,都是仁者見仁、智者見智的東西,適合別的場景但不一定適合你的場景。作為一名合格的程序員,切不可一味地"拿來主義"。

            1.為什么要復制粘貼代碼

            復制粘貼現有代碼,可以節省開發時間;復制粘貼穩定代碼,可以降低系統故障風險;復制粘貼網絡代碼,可以把別人的成果化為己用。

            2.復制粘貼代碼帶來問題

            你對復制的代碼理解程度是多少?實現邏輯是否合理?能不能穩定運行?存在多少潛在的 Bug?這個代碼在項目中已經復制粘貼了多少次?根據“三則重構”原則,你是否需要對這些相同代碼進行重構?代碼被復制粘貼次數越多,帶來的代碼維護問題越多。多個代碼版本的更改和修正,要保持這些代碼的同步,就必須需要在每一處進行同樣的修改,增加了維護的成本和風險。

            總之,復制粘貼代碼,跟其它編碼方法一樣,沒有優劣對錯之分。它只是一種方法,你可以善用,也可以濫用。如果我們用到了復制粘貼,我們就必須為結果負責。

            方法3:用文本替換生成代碼

            1.生成代碼樣例

            已經編寫好的用戶查詢相關代碼:

            /** 查詢用戶服務函數 */public PageData<UrVO> queryUr(QueryUrParameterVO parameter) { Long totalCount = urDAO.countByParameter(parameter); List<UrVO> urList = null; if (Objects.nonNull(totalCount) && totalCount.compareTo(0L) > 0) { urList = urDAO.queryByParameter(parameter); } return new PageData<>(totalCount, urList);}/** 查詢用戶控制器函數 */@RequestMapping(path = "/queryUr", method = RequestMethod.POST)public Result<PageData<UrVO>> queryUr(@Valid @RequestBody QueryUrParameterVO parameter) { PageData<UrVO> pageData = urService.queryUr(parameter); return Result.success(pageData);}

            如果我們要編寫公司查詢相關代碼,其代碼形式與用戶查詢類似,整理出替換關系如下:

            把"用戶"替換為"公司";把"Ur"替換為"Company";把"ur"替換為"company"。

            利用Notepad、EditPlus等文本編輯器,選擇區分大小寫,進行普通文本替換,最終得到結果如下:

            /** 查詢公司服務函數 */public PageData<CompanyVO> queryCompany(QueryCompanyParameterVO parameter) { Long totalCount = companyDAO.countByParameter(parameter); List<CompanyVO> companyList = null; if (Objects.nonNull(totalCount) && totalCount.compareTo(0L) > 0) { companyList = companyDAO.queryByParameter(parameter); } return new PageData<>(totalCount, companyList);}/** 查詢公司控制器函數 */@RequestMapping(path = "/queryCompany", method = RequestMethod.POST)public Result<PageData<CompanyVO>> queryCompany(@Valid @RequestBody QueryCompanyParameterVO parameter) { PageData<CompanyVO> pageData = companyService.queryCompany(parameter); return Result.success(pageData);}

            利用文本替換生成代碼,整段代碼生成時間不會超過1分鐘。

            2.主要優缺點

            主要優點:

            生成代碼速度較快。

            主要缺點:

            必須編寫樣例代碼;只適用于文本替換的情景。方法4:用Excel公式生成代碼

            Excel的公式非常強悍,可以用于編寫一些公式化的代碼。

            1.利用Excel公式生成模型類

            從WIKI上拷貝接口模型定義到Excel里,樣例數據內容如下:

            編寫Excel公式如下:

            = "/** "&D6&IF(ISBLANK(F6), "", "("&F6&")")&" */ "&IF(E6 = "否", IF(C6 = "String", "@NotBlank", "@NotNull"), "")&" private "&C6&" "&B6&";"

            利用公式生成代碼如下:

            /** 用戶標識 */ @NotNull private Long id;/** 用戶名稱 */ @NotBlank private String name;/** 用戶性別(0:未知;1:男;2:女) */ @NotNull private Integer x;/** 用戶描述 */ private String description;

            創建模型類,整理代碼如下:

            /** 用戶DO類 */public class UrDO { /** 用戶標識 */ @NotNull private Long id; /** 用戶名稱 */ @NotBlank private String name; /** 用戶性別(0:未知;1:男;2:女) */ @NotNull private Integer x; /** 用戶描述 */ private String description; ......}

            2.利用Excel公式生成枚舉類

            從WIKI上拷貝枚舉定義到Excel里,樣例數據內容如下:

            編寫Excel公式如下:

            ="/** "&D2&"("&B2&") */"&C2&"("&B2&", """&D2&"""),"

            利用公式生成代碼如下:

            /** 空(0) */NONE(0, "空"),/** 男(1) */MAN(1, "男"),/** 女(2) */WOMAN(2, "女"),

            創建枚舉類,整理代碼如下:

            /** 用戶性別枚舉 */public enum UrSex { /** 枚舉定義 */ /** 空(0) */ NONE(0, "空"), /** 男(1) */ MAN(1, "男"), /** 女(2) */ WOMAN(2, "女"); ......}

            3.利用Excel公式生成數據庫語句

            用Excel整理的公司列表如下,需要整理成SQL語句直接插入數據庫:

            編寫Excel公式如下:

            = "('"&B2&"', '"&C2&"', '"&D2&"', '"&E2&"'),"

            利用公式生成SQL如下:

            ('高德', '首開大廈', '(010)11111111', 'gaode@xxx.com'),('阿里云', '綠地中心', '(010)22222222', 'aliyun@xxx.com'),('菜鳥', '阿里中心', '(010)33333333', 'cainiao@xxx.com'),

            添加into語句頭,整理SQL如下:

            inrt into t_company(name, address, phone, email) values('高德', '首開大廈', '(010)11111111', 'gaode@xxx.com'),('阿里云', '綠地中心', '(010)22222222', 'aliyun@xxx.com'),('菜鳥', '阿里中心', '(010)33333333', 'cainiao@xxx.com');

            4.主要優缺點

            主要優點:

            適用于表格化數據的代碼生成;寫好公式后,拖拽生成代碼,生成速度較快。

            主要缺點:

            不適用于復雜功能的代碼生成。方法5:用工具生成代碼

            用工具生成代碼,顧名思義就是借用已有的工具生成代碼。很多開發工具都提供一些工具生成代碼,比如:生成構造函數,重載基類/接口函數,生成Getter/Setter函數,生成toString函數……能夠避免很多手敲代碼。還有一些生成代碼插件,也可以生成滿足某些應用場景的代碼。

            這里以mybatis-generator插件生成代碼為例,介紹如何利用工具生成代碼。

            1.安裝運行插件

            具體方法這里不再累述,自行上網搜索文檔了解。

            2.生成代碼樣例

            2.1.生成模型類代碼

            文件Ur.java內容:

            ......public class Ur { private Long id; private String ur; private String password; private Integer age; ......}

            2.2.生成映射接口代碼

            文件UrMapper.java內容:

            ......public interface UrMapper { Ur lectByPrimaryKey(Long id); ......}

            2.3.生成映射XML代碼

            文件UrMapper.xml內容:

            ......<mapper namespace="com.test.dao.UrMapper" > <resultMap id="BaResultMap" type="com.test.pojo.Ur" > <id column="id" property="id" jdbcType="BIGINT" /> <result column="ur" property="ur" jdbcType="VARCHAR" /> <result column="password" property="password" jdbcType="VARCHAR" /> <result column="age" property="age" jdbcType="INTEGER" /> </resultMap> <sql id="Ba_Column_List" > id, ur, password, age </sql> <lect id="lectByPrimaryKey" resultMap="BaResultMap" parameterType="java.lang.Long" > lect <include refid="Ba_Column_List" /> from test_ur where id = #{id,jdbcType=BIGINT} </lect> ......</mapper>

            3.主要優缺點

            主要優點:

            利用生成代碼插件,生成代碼速度較快;利用插件配置文件,控制生成想要的功能代碼。

            主要缺點:

            需要時間研究和熟悉生成代碼插件的使用;生成的代碼不一定滿足代碼規范,每次生成后需進行代碼合規;重新生成代碼后,容易覆蓋自定義代碼(建議維護單獨的生成代碼庫,通過DIFF工具比較代碼差異,然后再賦值粘貼差異代碼)。方法6:用代碼生成代碼

            用代碼生成代碼,就是自己編寫代碼,按照自己的格式生成代碼。下面,以生成基于MyBatis的數據庫訪問代碼為例說明。

            1.查詢表格信息

            首先,我們要從數據庫中拿到我們生成代碼所需要的表和列相關信息。

            1.1.查詢表信息

            查詢表信息語句:

            lect t.table_name as '表名稱', t.table_comment as '表備注'from information_schema.tables twhere t.table_schema = ?and t.table_type = 'BASE TABLE'and t.table_name = ?;

            其中,第1個問號賦值數據庫名稱,第2個問號賦值表名稱。

            查詢表信息結果:

            1.2.查詢列信息

            查詢列信息語句:

            lect c.column_name as '列名稱', c.column_comment as '列備注', c.data_type as '數據類型', c.character_maximum_length as '字符長度', c.numeric_precision as '數字精度', c.numeric_scale as '數字范圍', c.column_default as '', c.is_nullable as '是否可空', c.column_key as '列鍵名'from information_schema.columns cwhere c.table_schema = ?and c.table_name = ?order by c.ordinal_position;

            其中,第1個問號賦值數據庫名稱,第2個問號賦值表名稱。

            查詢列信息結果:

            2.編寫生成代碼

            2.1.編寫生成模型類代碼

            /** 生成模型類文件函數 */private void generateModelClassFile(File dir, Table table, List<Column> columnList) throws Exception { try (PrintWriter writer = new PrintWriter(new File(dir, className + "DO.java"))) { String className = getClassName(table.getTableName()); String classComments = getClassComment(table.getTableComment()); writer.println("package " + groupName + "." + systemName + ".databa;"); ...... writer.println("/** " + classComments + "DO類 */"); writer.println("@Getter"); writer.println("@Setter"); writer.println("@ToString"); writer.println("public class " + className + "DO {"); for (Column column : columnList) { String fieldType = getFieldType(column); String fieldName = getFieldName(column.getColumnName()); String fieldComment = getFieldComment(column); writer.println(" /** " + fieldComment + " */"); writer.println(" private " + fieldType + " " + fieldName + ";"); } writer.println("}"); }}

            2.2.編寫生成DAO接口代碼

            /** 生成DAO接口文件函數 */private void generateDaoInterfaceFile(File dir, Table table, List<Column> columnList, List<Column> pkColumnList) throws Exception { try (PrintWriter writer = new PrintWriter(new File(dir, className + "DAO.java"))) { String className = getClassName(table.getTableName()); String classComments = getClassComment(table.getTableComment()); writer.println("package " + groupName + "." + systemName + ".databa;"); ...... writer.println("/** " + classComments + "DAO接口 */"); writer.println("public interface " + className + "DAO {"); writer.println(" /** 獲取" + classComments + "函數 */"); writer.print(" public " + className + "DO get("); boolean isFirst = true; for (Column pkColumn : pkColumnList) { if (!isFirst) { writer.print(", "); } el { isFirst = fal; } String fieldType = getFieldType(pkColumn); String fieldName = getFieldName(pkColumn.getColumnName()); writer.print("@Param("" + fieldName + "") " + fieldType + " " + fieldName); } writer.println(");"); ...... writer.println("}"); }}

            2.3.編寫生成DAO映射代碼

            /** 生成DAO映射文件函數 */private void generateDaoMapperFile(File dir, Table table, List<Column> columnList, List<Column> pkColumnList) throws Exception { try (PrintWriter writer = new PrintWriter(new File(dir, className + "DAO.xml"))) { String className = getClassName(table.getTableName()); String classComments = getClassComment(table.getTableComment()); writer.println("<?xml version="1.0" encoding="UTF-8"?>"); ...... writer.println("<!-- " + classComments + "映射 -->"); writer.println("<mapper namespace="" + groupName + "." + systemName + ".databa." + className + "DAO">"); writer.println(" <!-- 所有字段語句 -->"); writer.println(" <sql id="fields">"); if (CollectionUtils.isNotEmpty(columnList)) { boolean isFirst = true; String columnName = getColumnName(pkColumn.getColumnName()); for (Column column : columnList) { if (isFirst) { isFirst = fal; writer.println(" " + columnName); } el { writer.println(" , " + columnName); } } } writer.println(" </sql>"); writer.println(" <!-- 獲取" + classComments + "函數語句 -->"); writer.println(" <lect id="get" resultType="" + groupName + "." + systemName + ".databa." + className + "DO">"); writer.println(" lect"); writer.println(" <include refid="fields"/>"); writer.println(" from " + table.getTableName()); boolean isFirst = true; for (Column pkColumn : pkColumnList) { String columnName = getColumnName(pkColumn.getColumnName()); String fieldName = getFieldName(pkColumn.getColumnName()); writer.print(" "); if (isFirst) { writer.print("where"); isFirst = fal; } el { writer.print("and"); } writer.println(" " + columnName + " = #{" + fieldName + "}"); } writer.println(" </lect>"); writer.println("</mapper>"); }}

            3.生成相關代碼

            3.1.生成的模型類代碼

            /** 組織公司DO類 */@Getter@Setter@ToStringpublic class OrgCompanyDO { /** 公司標識 */ private Long id; /** 公司名稱 */ private String name; /** 聯系地址 */ private String address; /** 公司描述 */ private String description;}

            3.2.生成的DAO接口代碼

            /** 組織公司DAO接口 */public interface OrgCompanyDAO { /** 獲取組織公司函數 */ public OrgCompanyDO get(@Param("id") Long id);}

            3.3.生成的DAO映射代碼

            <!-- 組織公司映射 --><mapper namespace="xxx.databa.OrgCompanyDAO"> <!-- 所有字段語句 --> <sql id="fields"> id , name , address , description </sql> <!-- 獲取組織公司函數語句 --> <lect id="get" resultType="xxx.databa.OrgCompanyDO"> lect <include refid="fields"/> from org_company where id = #{id} </lect></mapper>

            3.主要優缺點

            主要優點:

            代碼格式可以定制,保證生成代碼合規;代碼功能可以定制,只生成需要的代碼;經過前期代碼沉淀后,后期能夠直接使用。

            主要缺點:

            需要研究數據來源,保證能獲取到生成代碼所需的數據;需要建立數據模型、編寫生成代碼,耗費時間比較長。

            終極方法:無招勝有招

            編碼的終極方法,是不是直接對著電腦說需求,然后電腦就自動生成代碼了?未來科技發展到一定水平后,這種情況或許會變成現實。但是,目前這種情況是不現實的。現實中,想要做到"大口一張、代碼就來",除非你是老板、產品經理或者技術管理者。

            編碼的終極方法是“無招勝有招”,"無招"并不是不講究"招式",而是不拘泥于某一"招式",信手拈來合適的"招式"為宜。本文中列舉的各種編碼方法,沒有高低優劣之分,只有合不合適之說。所以,靈活地運用各種編碼方法,就是編碼的終極方法。

            代碼規范化

            在上面的各種編碼方法中,很多方法都需要手工編寫樣例代碼。如果你的代碼不遵循代碼規范,就很難發現代碼之間的共性,并抽象出能夠作為標準的樣例代碼;如果作為標準的樣例代碼不滿足代碼規范,必然導致生成的代碼也不滿足代碼規范,于是把這些不規范放大了十倍、百倍甚至千倍。 所以,代碼規范化是編碼的重中之重。

            請參考阿里集團的開發規約:

            《阿里經濟體開發規約》

            我寫的一些代碼規范化建議:

            《Java函數優雅之道》

            《那些年,我們見過的Java服務端“亂象”》

            后記

            在構思這篇文章的時候,在網上看見這么一個梗:一位網友諷刺一位阿里人的簡歷,滿篇都是"沉淀了一套XX方法論,為XX業務賦能。",用了流行語"賦能"顯得很"高大上"。姑且不論他的簡歷如何,能夠從方法論上著手的人,一定有值得我們學習的地方。這里,我也來蹭一下這個梗,就取一個高大上的名字《編碼方法論,賦能你我他》。

            本文作者:陳昌毅,花名常意,高德地圖技術專家,2018年加入阿里巴巴,一直從事地圖數據采集的相關工作。

            本文發布于:2023-02-28 21:02:00,感謝您對本站的認可!

            本文鏈接:http://www.newhan.cn/zhishi/a/1677718365101066.html

            版權聲明:本站內容均來自互聯網,僅供演示用,請勿用于商業和其他非法用途。如果侵犯了您的權益請與我們聯系,我們將在24小時內刪除。

            本文word下載地址:includefile(include什么意思).doc

            本文 PDF 下載地址:includefile(include什么意思).pdf

            相關文章
            留言與評論(共有 0 條評論)
               
            驗證碼:
            推薦文章
            排行榜
            Copyright ?2019-2022 Comsenz Inc.Powered by ? 實用文體寫作網旗下知識大全大全欄目是一個全百科類寶庫! 優秀范文|法律文書|專利查詢|
            主站蜘蛛池模板: 91麻豆亚洲国产成人久久| 女同亚洲精品一区二区三| 亚洲精品久荜中文字幕| 欧美日韩在线亚洲二区综二 | 国产精品高潮无码毛片| 手机看片日韩国产毛片| 国产成人一区二区三区免费 | 免费观看欧美性一级| 人妻精品动漫H无码中字| 精品av国产一区二区三区| 视频一区二区三区自拍偷拍| 精品人妻免费看一区二区三区| 亚洲超碰97无码中文字幕| 亚洲国产成人精品无码区蜜柚| 国内精品视频区在线2021| 无码一区二区三区中文字幕| 一级毛片在线观看免费| 日本高清色WWW在线安全| 日本系列亚洲系列精品 | 亚洲伊人成色综合网| 久久精品国产高潮国产夫妻| 日韩大片高清播放器| 人妻少妇精品视频二区| 精品亚洲AⅤ无码午夜在线| 亚洲精品麻豆一二三区| 狠狠五月深爱婷婷网| 亚洲有无码中文网| 日韩AV高清在线看片| 国产99视频精品免费专区| 国产在线一区二区不卡| 日本熟妇XXXX潮喷视频| 起碰免费公开97在线视频| 99久久无色码中文字幕鲁信| 国产第一页浮力影院入口| 久久免费精品视频老逼| 亚洲东京色一区二区三区| 强伦人妻一区二区三区视频18| 国产午夜福利一区二区三区| 久久中精品中文字幕入口| 欧美成人h精品网站| 亚洲综合一区二区三区不卡|