Тема: Як козаки роботу шукали.
ЗАОХОЧЕННЯ щодо пошуку роботи:
Запрошую надiслати вашиx тестiв на iнших мовах також (окрiм JAVA), бо маю себе перевiрити та знайти друзiв по виробничому цеху.
PHP программування, звисно рiч не проста. Особливо якщо ти бiльш поважаешь С in Linux або маешь внутрiшню вiдповiдальнiсть за СPU-low-costing програмний чартер. Адже, якщо ти повний ламер з описа iнших, маешь задавати питання поважним людям. Тому...
Довелося менi зустрiти на цьому форумi гуру PHP що блукав у пошуках жодного файного junior майже 2 роки. Я отримав завдання. Вiн отримав вiдповiдь. Менi до лоба - брудний ярлик ламера. Адже це не лiчить козаковi iз гучним iм'ям Rookie. Тому, шановнi, маю до вас запитання де та що помити рефакторiнгово? Прошу прийняти до зауваження - адже ранiше у життi до цього випадку я нiколи не працював у PHP, та мав довести швидке самонавчання за день.
Завдання:
#### php
<?
interface FileInterface {
/**
* Constructor
* @param string $filePath
*/
public function __construct($filePath);
/**
* Returns the file name
*
* @return string the relative path
*/
public function getFileName();
/**
* Check if file located in specific directory
*
* @param DirectoryInfo $directory
* @return boolean
*/
public function isInDirectory(DirectoryInfo $directory);
}
/**
* Реалізувати клас
*/
class DirectoryInfo {
# ваш код тут
}
/**
* Реалізувати інтерфейс
*/
class File implements FileInterface {
# ваш код тут
}
# цей код має працювати
$file = new File(__FILE__);
$file->isInDirectory(new DirectoryInfo(__DIR__)); // return true
$file = new File('/tmp/data/test.txt');
$file->isInDirectory(new DirectoryInfo('/tmp/data/')); // return true
$file->isInDirectory(new DirectoryInfo('/tmp')); // return true
$file->isInDirectory(new DirectoryInfo('/tmp/other')); // return false
$file->isInDirectory(new DirectoryInfo('/tmp/data/test')); // return false
$file->getFileName(); //return test.txt
?>
Рiшення:
error_reporting(E_ALL);
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
class DirectoryInfo {
private static $s_dir_path;
private static $ar_dir_files = array();
function __construct($o_fileDir) {
self::$s_dir_path = $o_fileDir;
self::$ar_dir_files = scandir($o_fileDir);
}
function __destruct() {
}
public function getDirName() {
return self::$s_dir_path;
}
public function getListFiles() {
return self::$ar_dir_files;
}
}
interface FileInterface {
public function getFileName();
public function isInDirectory(DirectoryInfo $directory);
}
class File implements FileInterface {
private static $s_file_path;
private static $s_dir_name;
private static $ar_dir_files = array();
function __construct($s_file_path) {
self::$s_file_path = $s_file_path;
$o_dirname = new DirectoryInfo(dirname($s_file_path));
self::$s_dir_name = $o_dirname->getDirName();
self::$ar_dir_files = $o_dirname->getListFiles();
}
function __destruct() {
}
public function getFileName() {
return basename(self::$s_file_path);
}
public function isInDirectory(DirectoryInfo $directory) {
$s_temp = dirname(self::$s_file_path);
if (!in_array(self::getFileName(), self::$ar_dir_files)) {
return false;
}
// for Linux file root
while ('/' !== $s_temp) {
if ($directory->getDirName() != $s_temp) {
$s_temp = dirname($s_temp);
} else {
return true;
}
}
return false;
}
}