草庐IT

一文了解编程领域的模版

力不竭!!!战不止!!! 2023-07-04 原文

文章目录

       🍊在编程领域,模板是一种代码片段,它可以被重复使用,并允许您在保持代码的基本结构不变的情况下,根据需要调整其中的内容。模板通常在构建大型程序或开发一类相关程序时非常有用,以减少代码冗余并提高代码可读性。

       🍊模板可以通过多种方式实现,具体取决于使用的编程语言。在 C++ 中,可以使用模板来实现泛型编程。在 Java 中,可以使用泛型来实现类似模板的功能。此外,许多编程语言都提供了模板引擎,可以生成静态 HTML 或动态网页。

模版含义

在编程领域中,模板可以有多种含义。以下是最常见的几种:

  1. 代码模板:代码模板是一段可以重复使用的代码片段。它通常用于生成大量相似的代码,从而减少代码冗余并提高代码的可读性。
  2. 泛型:泛型是指在一个类、接口或函数的定义中使用泛型,以提供对多种类型的支持。泛型模板可以在编译时为不同类型生成不同的代码版本,从而提供灵活的代码表示。
  3. 模板引擎:模板引擎是一种生成静态 HTML 或动态网页的工具。它通常使用特定的语法,将数据与模板中的代码结合,以生成最终的网页。

       模板的使用与实现方式因编程语言而异,但所有编程语言都提供了某种形式的模板来支持代码的重复使用和灵活性。

代码模版

       代码模板是指在编程过程中,预先编写好的一份代码,并通过一些技巧,将其中的特定部分替换为需要的信息,从而快速生成符合需求的代码。

       代码模板常用于节省编写重复代码的时间,以及保证代码质量和一致性。

以 Java 为例,下面是一个简单的代码模板文件(Template.txt):

public class ${ClassName} {
    public ${ReturnType} ${MethodName}(${Parameters} ) {
        // 业务逻辑code
        ${generalEditorCode}
    }
}

可以通过以下步骤使用此模板:

  1. 将模板代码复制到一个文件中,例如Template.txt。
  2. 读取模版文件。
  3. 将模板中的占位符替换为具体的值,如ClassName、ReturnType、MethodName和Parameters。
  4. 保存到新文件中(如MyApplication.java)。

        根据需要,在代码中对方法进行修改和扩展。

以下代码来实现读取模板并根据模板生成代码:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class GenerateCode {
    public static void main(String[] args) throws IOException {
    	public class GenerateCode {
    public static void main(String[] args) throws IOException {
        //替换模版的信息(根据需要,玩转模版)
        String className = "MyApplication";
        String returnType = "void";
        String methodName = "myMethod";
        String parameters = "int a, String b";
        String generalEditorCode = "System.out.println(a + b);";

        // 读取模板
        BufferedReader br = new BufferedReader(new FileReader("./file/Template.txt"));
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = br.readLine()) != null) {
            sb.append(line).append("\n");
        }
        br.close();

        // 替换模版中占位符
        String template = sb.toString();
        template = template.replace("${ClassName}", className);
        template = template.replace("${ReturnType}", returnType);
        template = template.replace("${MethodName}", methodName);
        template = template.replace("${Parameters}", parameters);
        template = template.replace("${GeneralEditorCode}", generalEditorCode);

        // 写入新文件
        FileWriter fw = new FileWriter("./file/" + className + ".java");
        fw.write(template);
        fw.close();
    }
}
    }
}

        以我的视角为例,运行代码后会生成一个新的.java文件

泛型

下面是一个简单的泛型类,它可以存储任意类型的数据:

public class Box<T> {
   private T t;

   public void add(T t) {
      this.t = t;
   }

   public T get() {
      return t;
   }
}

public class Main {
   public static void main(String[] args) {
      Box<Integer> integerBox = new Box<Integer>();
      Box<String> stringBox = new Box<String>();

      integerBox.add(10);
      stringBox.add("Hello World");

      System.out.println("Integer Value : " + integerBox.get());
      System.out.println("String Value : " + stringBox.get());
   }
}

       在这个例子中,我们定义了一个名为 Box 的泛型类,并使用了 add 和 get 方法在其中存储和检索值。在创建 Box 对象时,您可以在括号中指定数据类型,如 Integer 或 String。

模版引擎

       模板引擎是一种生成动态内容的工具,常用于 Web 开发中。模板引擎允许用户创建一个静态的 HTML 页面,其中一些内容是可以动态生成的。通过在 HTML 模板中插入占位符,引擎可以根据需要在运行时自动替换为实际的内容。

以下是 Java 中使用 FreeMarker 作为模板引擎的示例代码:

  1. 创建 pom.xml,添加 FreeMarker 依赖
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.30</version>
</dependency>
  1. Java代码实现
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;

/**
* @author 
* @date 2023年02月03日 14:43
*/
public class TemplatEengine {
   public static void main(String[] args) {
       // 定义模板(模版可以存在文件系统、DB或者云端存储等)
       String template = "<html>\n" +
               "    <head>\n" +
               "        <title>${title}</title>\n" +
               "    </head>\n" +
               "    <body>\n" +
               "        <h1>${header}</h1>\n" +
               "        <p>${message}</p>\n" +
               "    </body>\n" +
               "</html>";

       // 创建模板配置
       Configuration configuration = new Configuration();

       // 将模板数据存入数据模型
       Map<String, Object> dataModel = new HashMap<>();
       dataModel.put("title", "My Page");
       dataModel.put("header", "Welcome");
       dataModel.put("message", "Hello, World!");

       // 生成模板
       StringWriter writer = new StringWriter();
       try {
           Template t = new Template("template", new StringReader(template), configuration);
           t.process(dataModel, writer);
           System.out.println(writer.toString());
       } catch (TemplateException | IOException e) {
           e.printStackTrace();
       }
   }

}

       该代码创建了一个简单的 HTML 模板,其中包含三个占位符: t i t l e 、 {title}、 title{header} 和 ${message}。接下来,代码将数据模型存入数据字典,然后使用 FreeMarker 模板引擎生成最终的 HTML。

运行结果

小结

       在编程领域的一些场景下,模板是作为特定类型项目或任务的起点的蓝图或表单。在编程环境中,模板通常用于生成可针对特定用例进行定制的可重用代码。

       有几种类型的模板,包括代码模板、通用模板和模板引擎。代码模板为一段代码提供了一个基本结构,可以用作起点,而通用模板允许创建可以处理一系列数据类型的灵活代码。模板引擎是一种更高级的模板形式,允许创建和呈现动态 HTML 模板。

       总的来说,这些模版都可以提高效率,减少重复的工作量,可以给研发提供额外的时间来关注其他事情,如稳定性、代码优化、重构等。⚠️但是,了解使用模板的限制和权衡很重要,因为模板也可能会增加代码的复杂性并使其更难调试。

有关一文了解编程领域的模版的更多相关文章

  1. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  2. 网络编程套接字 - 2

    网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识

  3. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  4. ruby - 如何以编程方式删除实例上的 "singleton information"以使其编码(marshal)? - 2

    我创建了一个由于“在运行时执行的单例元类定义”而无法编码的对象(这段代码的描述是否正确?)。这是通过以下代码执行的:#defineclassXthatmyusesingletonclassmetaprogrammingfeatures#throughcallofmethod:break_marshalling!classXdefbreak_marshalling!meta_class=class我该怎么做才能使对象编码正确?是否可以从对象instance_of_x的classX中“移除”单例组件?我真的需要一个建议,因为我们的一些对象需要通过Marshal.dump序列化机制进行缓存。

  5. ruby - 了解在 Ruby 中与 lambda 一起使用的 inject 行为 - 2

    我经常将预配置的lambda插入可枚举的方法中,例如“map”、“select”等。但是“注入(inject)”的行为似乎有所不同。例如与mult4=lambda{|item|item*4}然后(5..10).map&mult4给我[20,24,28,32,36,40]但是,如果我制作一个2参数lambda用于像这样的注入(inject),multL=lambda{|product,n|product*n}我想说(5..10).inject(2)&multL因为“inject”有一个可选的单个初始值参数,但这给了我......irb(main):027:0>(5..10).inject

  6. Ruby 元编程问题 - 2

    我正在查看Ruby日志记录库Logging.logger方法并从sourceatgithub提出问题与这段代码有关:logger=::Logging::Logger.new(name)logger.add_appendersappenderlogger.additive=falseclass我知道类 最佳答案 这实际上删除了方法(当它实际被执行时)。这是确保close不会被调用两次的保障措施。看起来好像有嵌套的“class 关于Ruby元编程问题,我们在StackOverflow上找到一

  7. ruby-on-rails - 如何测试自己对 Ruby/ROR 的了解? - 2

    是否有self验证的问题列表。看着那个,我可以确定我知道。我应该复习一下。在学习的过程中,我列了一个这样的list,但它只包含我在某处听说过的项目。我需要一段时间才能找到新的东西。 最佳答案 以下是针对ruby​​和Rails的一些测试列表。证书名称:RubyonRails谁提供:oDeskIncorporation认证费用:免费网站:https://www.odesk.com/tests/985?pos=0证书名称:RubyonRails提供者:Techgig.com(TimesBusinessSolutionsLimited(T

  8. ruby - Paperclip:以编程方式分配图像并设置其名称 - 2

    使用Paperclip,我想从这样的URL抓取图像:require'open-uri'user.photo=open(url)问题是我最后得到一个像“open-uri20110915-4852-1o7k5uw”这样的文件名。有什么方法可以更改user.photo上的文件名?作为一个额外的变化,Paperclip将我的文件存储在S3上,所以如果我可以在初始分配中设置我想要的文件名就更好了,这样图像就会上传到正确的S3key。像这样:user.photo=open(url),:filename=>URI.parse(url).path 最佳答案

  9. ruby - 如何以编程方式检查证书是否已被吊销? - 2

    我正在开发一个xcode自动构建系统。在执行一些预构建验证时,我想检查指定的证书文件是否已被撤销。我了解securityverify-cert验证其他证书属性但不验证吊销。我如何检查撤销?我正在用Ruby编写构建系统,但我对任何语言的想法都持开放态度。我阅读了这个答案(Openssl-Howtocheckifacertificateisrevokedornot),但指向底部的链接(DoesOpenSSLautomaticallyhandleCRLs(CertificateRevocationLists)now?)进入的Material对我的目的来说有点过于复杂(用户上传已撤销的证书是一

  10. ruby-on-rails - 了解 "attribute_will_change!"方法 - 2

    我想覆盖store_accessor的getter。可以查到here.代码在这里:#Fileactiverecord/lib/active_record/store.rb,line74defstore_accessor(store_attribute,*keys)keys=keys.flatten_store_accessors_module.module_evaldokeys.eachdo|key|define_method("#{key}=")do|value|write_store_attribute(store_attribute,key,value)enddefine_met

随机推荐