今天的一个面试题,总结一下
2011-10-26 22:40
519 查看
题目:
输入是 日期,时间, 姓名,结果
但是数据源不清楚,可能是文件,可能是数据库
处理也不清,可能计算一段时期的人数,也可能统计别的
输出也不清楚,可能echo出来,也可以写入到文件或者数据库
要求写出程序能够满足这些变化的需求。
实现:
用到的设计模式:
工厂模式,策略模式
文件结构:
看到题目中得那么多的不确定因素,就想到了用一种良好的设计模式来实现他~
首先,程序应该分成输入,处理,和输出三部分~~我们不妨给这个程序初始化接口
<?php
interface initialCalculate
{
//输入
public function input($inputConf);
//处理
public function handle($inputArray);
//输出
public function output();
}
然后我们就该对这个接口来实现了~~
下面这个类具体实现的是从文件里读取数据,统计结果数,之后在屏幕上输出来
当然如果需要别的实现的话, 也可以再编写一个这样的类
<?php
class calculateNumberFromLogFile implements initialCalculate
{
public function input($inputConf)
{
$calculate = new calculate;
$inputor = $calculate->creatInputor('logFile','/document/');//输入
return $inputor->getCalculateInfo($inputConf);//获取固定格式输入数组
}
public function handle($inputArray)
{
$calculate = new calculate;
$handler = $calculate->creatHandler('Passed','./');//统计处理
return $handler->handleCalculateInfo($inputArray);//统计
}
public function output()
{
$calculate = new calculate;
$outputor = $calculate->creatOutputor('printScreen','Passed');//输出
return $outputor->outputCalculateInfo();//输出
}
}
在上面的类中,不管你想用哪个数据源,哪个处理方式,哪个输出方式 都可以通过 calculate类来统一调用
<?php
/**
* calculate base class
*/
class calculate
{
private $inputDir = 'method/inputor';
private $handleDir = 'method/handler';
private $outputDir = 'method/outputor';
public function __construct(){}
public function creatInputor($method,$path = '')
{
include $this->inputDir.$path.$method.'.php';
return new $method;
}
public function creatHandler($method,$path = '')
{
include $this->handleDir.$path.$method.'.php';
return new $method;
}
public function creatOutputor($method,$handler)
{
include $this->outputDir.'/'.$handler.'/'.$method.'.php';
return new $method;
}
}
输入,处理,输出类:
<?php
/**
* Input file for the log file
*/
class logFile
{
public function __construct(){}
public function getCalculateInfo($logFileConf)
{
if(empty($logFileConf))
{
exit('error');
}
$items = array();
$results = array();
$logFileArray = file($logFileConf['filePath']);
foreach($logFileArray as $temp)
{
$items = explode('|', $temp);
$line['date'] = $items[0];
$line['interviewer'] = $items[1];
$line['interviewee'] = $items[2];
$line['time'] = $items[3];
$line['result'] = trim($items[4]);
$results[] = $line;
}
return $results;
}
}
<?php
/**
* handler file
*/
class Passed
{
public static $count;
public static $pass;
public function __construct(){}
public function handleCalculateInfo($inputArray)
{
if(empty($inputArray))
{
exit('error');
}
foreach($inputArray as $line)
{
if($line['interviewer'] == '张三' && $line['date'] == date('Ymd', time()))
{
self::$count += 1;
if($line['result'] == 'pass')
{
self::$pass += 1;
}
}
}
return 0;
}
}
<?php
/**
* output file
*/
class printScreen
{
public function __construct(){}
public function outputCalculateInfo()
{
echo '今天的人数为:'.Passed::$count.'人<br />';
echo '通过的人数为:'.Passed::$pass.'人<br />';
return 0;
}
}
如果要添加一种输入的来源,在lib\method\inputor\... 下编写输入类
添加统计方式,在lib\method\handler 下编写统计类
添加输出方式,在lib\method\outputor\... 下编写输出类
然后根据接口lib\initialCalculate.php 在lib\initial 下编写类
今天面试写的程序~~ 应该还有很多不足之处
输入是 日期,时间, 姓名,结果
但是数据源不清楚,可能是文件,可能是数据库
处理也不清,可能计算一段时期的人数,也可能统计别的
输出也不清楚,可能echo出来,也可以写入到文件或者数据库
要求写出程序能够满足这些变化的需求。
实现:
用到的设计模式:
工厂模式,策略模式
文件结构:
看到题目中得那么多的不确定因素,就想到了用一种良好的设计模式来实现他~
首先,程序应该分成输入,处理,和输出三部分~~我们不妨给这个程序初始化接口
<?php
interface initialCalculate
{
//输入
public function input($inputConf);
//处理
public function handle($inputArray);
//输出
public function output();
}
然后我们就该对这个接口来实现了~~
下面这个类具体实现的是从文件里读取数据,统计结果数,之后在屏幕上输出来
当然如果需要别的实现的话, 也可以再编写一个这样的类
<?php
class calculateNumberFromLogFile implements initialCalculate
{
public function input($inputConf)
{
$calculate = new calculate;
$inputor = $calculate->creatInputor('logFile','/document/');//输入
return $inputor->getCalculateInfo($inputConf);//获取固定格式输入数组
}
public function handle($inputArray)
{
$calculate = new calculate;
$handler = $calculate->creatHandler('Passed','./');//统计处理
return $handler->handleCalculateInfo($inputArray);//统计
}
public function output()
{
$calculate = new calculate;
$outputor = $calculate->creatOutputor('printScreen','Passed');//输出
return $outputor->outputCalculateInfo();//输出
}
}
在上面的类中,不管你想用哪个数据源,哪个处理方式,哪个输出方式 都可以通过 calculate类来统一调用
<?php
/**
* calculate base class
*/
class calculate
{
private $inputDir = 'method/inputor';
private $handleDir = 'method/handler';
private $outputDir = 'method/outputor';
public function __construct(){}
public function creatInputor($method,$path = '')
{
include $this->inputDir.$path.$method.'.php';
return new $method;
}
public function creatHandler($method,$path = '')
{
include $this->handleDir.$path.$method.'.php';
return new $method;
}
public function creatOutputor($method,$handler)
{
include $this->outputDir.'/'.$handler.'/'.$method.'.php';
return new $method;
}
}
输入,处理,输出类:
<?php
/**
* Input file for the log file
*/
class logFile
{
public function __construct(){}
public function getCalculateInfo($logFileConf)
{
if(empty($logFileConf))
{
exit('error');
}
$items = array();
$results = array();
$logFileArray = file($logFileConf['filePath']);
foreach($logFileArray as $temp)
{
$items = explode('|', $temp);
$line['date'] = $items[0];
$line['interviewer'] = $items[1];
$line['interviewee'] = $items[2];
$line['time'] = $items[3];
$line['result'] = trim($items[4]);
$results[] = $line;
}
return $results;
}
}
<?php
/**
* handler file
*/
class Passed
{
public static $count;
public static $pass;
public function __construct(){}
public function handleCalculateInfo($inputArray)
{
if(empty($inputArray))
{
exit('error');
}
foreach($inputArray as $line)
{
if($line['interviewer'] == '张三' && $line['date'] == date('Ymd', time()))
{
self::$count += 1;
if($line['result'] == 'pass')
{
self::$pass += 1;
}
}
}
return 0;
}
}
<?php
/**
* output file
*/
class printScreen
{
public function __construct(){}
public function outputCalculateInfo()
{
echo '今天的人数为:'.Passed::$count.'人<br />';
echo '通过的人数为:'.Passed::$pass.'人<br />';
return 0;
}
}
如果要添加一种输入的来源,在lib\method\inputor\... 下编写输入类
添加统计方式,在lib\method\handler 下编写统计类
添加输出方式,在lib\method\outputor\... 下编写输出类
然后根据接口lib\initialCalculate.php 在lib\initial 下编写类
今天面试写的程序~~ 应该还有很多不足之处
相关文章推荐
- 今天遇到这样一个面试题,在此记录一下
- 今天看到一个sql的面试题,我想应该记录一下
- 总结一下今天tcp服务器的一个rst问题
- 今天看了一下,java的基础面试题,关于抽象类和抽象方法的总结
- 今天做了一个小小的项目 总结一下。
- 今天参加了一个面试,总结一下几道题
- 朋友今天问我一个面试题,我看了看,给大家分享一下
- 朋友今天问我一个面试题,我看了看,给大家分享一下
- 朋友今天问我一个面试题,我看了看,给大家分享一下
- 今天被领导好好教训了一番~特别总结一下
- 郁闷死了 今天删了一个raid 卷 没有做备份 有么有大神教我恢复一下啊
- 今天初步学习了一下Git版本控制,总结一下,后面加下用Git下载android源代码
- Struts2中关于"There is no Action mapped for namespace / and action name"的总结 今天在调试一个基础的Struts2框架小程
- 今天做应用 用到了不少关于时间处理方面的东西,总结一下,希望大家指正!
- segmentation fault----在Linux下真是一个蛋疼的错误,总结一下出现这错误的经历
- 开发人员与产品人员的冲突点总结!开发和产品人员都来看一下,那一个是你目前的情况!
- 今天总结一下matlab有用快捷键
- 面试题总结15 自己构建一个哈希表
- 今天遇到一台服务器的YUM源不可用了,更改了一个YUM源,记录一下方法
- 使用MERGE语句,这里简单总结一下 (一个语句解决update 和 insert 功能)