《编程珠玑》代码之路5:格式信函编程----将数据和代码分开的好处

我们打开一些网站,经常会看到不同客户专属信息,例如:

Welcome back, Jane!
We hope that you and all the members
of the Public family are constantly
reminding your neighbers there
on Maple Street to shop with us.
As usuall, we will ship your order to
    Ms. Jane Q. Public
    600 Maple Street
    Your Town, Iowa 12345

.......

其中加黑部分来自于不同的用户,但模板都是一样的。

用户的字段是这样的,不同的用户会有不同的字段,但规格相同:

str[]= {"Public", "Jane", "Q", "Ms.", "600", "Maple Street", "Your Town", "Iowa", "12345"};

于是很多程序员就会这些撸代码:

以第一行为例:

printf("Welcome back")
printf("%s!", str[0]);

然后每一行都这么写一遍,可以想象,如果这时候团队的PM给了你个模板,你就在代码里把它敲了一遍,文档5000个字符你就得敲5000多个字符的代码,而且PM一旦把模板改了,又得再改一遍代码。不仅工作量大,还没啥意义,那么怎么办呢?

怎么做到模板改了,我还不用改代码呢?而且还的保证不懂技术的PM也方便。

看下面这个东西:

Welcome back, $1!
We hope that you and all the members
of the $0 family are constantly
reminding your neighbers there
on $5 to shop with us.
As usuall, we will ship your order to
    $3 $1 $2. $0
    $4 $5
    $6, $7 $8

.......

对了,用$x代表第x个信息,然后你随便改模板,我就写个解析函数,解析一下就可以了。

解析函数干什么呢,就是在上述约定的文档中,碰到模板字符,我直接输出就好了。碰到用户字段,我就输出相应的字段。这样,我就不用把文档里的字符都给敲一遍了,大家都方便。这就是数据和代码分开的好处。

解析函数如下:

#include <iostream>
#include <cstdio>
#include <string>
#include <vector>

using namespace std;

//实际中这个字符串是从数据库读出来的
string str[] = {"Public", "Jane", "Q", "Ms.", "600", "Maple Street", "Your Town", "Iowa", "12345"};
vector<string> field(str, str + 10);

int main(){
    //这个文件指的是带有约定$的模板文档
	freopen("FormLetterSchema.txt", "r", stdin);
	freopen("out.txt", "w", stdout);

	char c;
	while (scanf("%c", &c) != EOF){

		if (c != '$'){
			printf("%c", c);
		}else{

			scanf("%c", &c);
			//如果在文本中本身就是$

			if (c == '$'){
				printf("$");
			}else{//否则输出相应的字段
				printf("%s", field[c - '0'].c_str());
			}

		}
	}
	
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Code from Programming Pearls Column 1: Programs for sorting integers bitsort.c -- Sort with bit vectors. sortints.cpp -- Sort using C++ STL sets. qsortints.c -- Sort with C library qsort. bitsortgen.c -- Generate random integers for sorting. Column 2: Test and time algorithms rotate.c -- Three ways to rotate the elements of a vector. The next two program are used in a pipeline to compute all anagrams in a dictionary sign.c -- Sign each word by its letters in sorted order. squash.c -- Put each anagram class on a single line. Column 5: Scaffolding for testing and timing search functions search.c -- Linear and binary search. Column 7: Tiny experiment on C run times timemod0.c -- Edit main to time one operation. Column 8: Compute the maximum-sum subsequence in an array maxsum.c -- Time four algs: n3, n2, n log n, n. Column 9: Code tuning programs genbins.c -- Profile this, then try a special-purpose allocator. macfun.c -- Time the cost of macros and functions. The column also uses rotate.c (Column 2), search.c (Column 5) and maxsum.c (Column 8). Column 11: Test and time sorting algorithms sort.cpp -- Mostly C, but also C++ sort function. SortAnim.java -- Animate those sort functions in Java. Column 12: Generate a sorted list of random integers sortedrand.cpp -- Several algorithms for the task. Column 13: Set representations for the problem in Column 12 sets.cpp -- Several data structures for sets. genbins.c (Column 9) implements the bin data structure in C. Column 14: Heaps priqueue.cpp -- Implement and test priority queues. The column also uses sort.c (Column 11) for heapsort. Column 15: Strings wordlist.cpp -- List words in the file, using STL set. wordfreq.cpp -- List words in the file, with counts, using STL map. wordfreq.c -- Same as above, with hash table in C. longdup.c -- Find long repeated strings in input. markov.c -- Generate random text from input. markovhash.c -- Like markov.c, but with hashing. markovlet.c -- Letter-level markov text, simple algorithm. Appendix 3: Cost Models spacemod.cpp -- Space used by various records. timemod.c -- Table of times used by various C constructs. You may use this code for any purpose, as long as you leave the copyright notice and book citation attached.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值