# Advanced PHP Programming- P5

Chia sẻ: Thanh Cong | Ngày: | Loại File: PDF | Số trang:50

0
65
lượt xem
6

## Advanced PHP Programming- P5

Mô tả tài liệu
Download Vui lòng tải xuống để xem tài liệu đầy đủ

Tham khảo tài liệu 'advanced php programming- p5', công nghệ thông tin, kỹ thuật lập trình phục vụ nhu cầu học tập, nghiên cứu và làm việc hiệu quả

Chủ đề:

Bình luận(0)

Lưu

## Nội dung Text: Advanced PHP Programming- P5

1. 178 Chapter 6 Unit Testing “; $this->numSentences = 2;$this->numWords = 16; $this->numSyllables = 24;$this->object = new Text_Statistics($this->sample); } function _ _construct($name) { parent::_ _construct($name); } } Sure enough, the bug is there. Mr. matches as the end of a sentence.You can try to avoid this problem by removing the periods from common abbreviations.To do this, you need to add a list of common abbreviations and expansions that strip the abbreviations of their punctuation.You make this a static attribute of Text_Statistics and then sub- stitute on that list during analyze_line. Here’s the code for this: class Text_Statistics { // ... static$abbreviations = array(‘/Mr\./’ =>’Mr’, ‘/Mrs\./i’ =>’Mrs’, ‘/etc\./i’ =>’etc’, ‘/Dr\./i’ =>’Dr’, ); // ... protected function analyze_line($line) { // replace our known abbreviations$line = preg_replace(array_keys(self::$abbreviations), array_values(self::$abbreviations), $line); preg_match_all(“/\b(\w[\w’-]*)\b/”,$line, $words); foreach($words[1] as $word) {$word = strtolower($word);$w_obj = new Text_Word($word);$this->numSyllables += $w_obj->numSyllables();$this->numWords++; if(!isset($this->_uniques[$word])) { $this->_uniques[$word] = 1; } else { $this->uniqWords++; } } preg_match_all(“/[.!?]/”,$line, $matches);$this->numSentences += count($matches[0]); } } 2. Unit Testing in a Web Environment 179 The sentence count is correct now, but now the syllable count is off. It seems that Mr. counts as only one syllable (because it has no vowels).To handle this, you can expand the abbreviation expansion list to not only eliminate punctuation but also to expand the abbreviations for the purposes of counting syllables. Here’s the code that does this: class Text_Statistics { // ... static$abbreviations = array(‘/Mr\./’ =>’Mister’, ‘/Mrs\./i’ =>’Misses’, //Phonetic ‘/etc\./i’ =>’etcetera’, ‘/Dr\./i’ =>’Doctor’, ); // ... } There are still many improvements you can make to the Text_Statistics routine. The $silentSyllable and$additionalSyllable arrays for tracking exceptional cases are a good start, but there is still much work to do. Similarly, the abbreviations list is pretty limited at this point and could easily be expanded as well. Adding multilingual support by extending the classes is an option, as is expanding the statistics to include other readability indexes (for example, the Gunning FOG index, the SMOG index, the Flesch-Kincaid grade estimation, the Powers-Sumner-Kearl formula, and the FORCAST Formula). All these changes are easy, and with the regression tests in place, it is easy to verify that modifications to any one of them does not affect current behavior. Unit Testing in a Web Environment When I speak with developers about unit testing in PHP in the past, they often said “PHP is a Web-centric language, and it’s really hard to unit test Web pages.” This is not really true, however. With just a reasonable separation of presentation logic from business logic, the vast majority of application code can be unit tested and certified completely independently of the Web.The small portion of code that cannot be tested independently of the Web can be validated through the curl extension. About curl curl is a client library that supports file transfer over an incredibly wide variety of Internet protocols (for example, FTP, HTTP, HTTPS, LDAP). The best part about curl is that it provides highly granular access to the requests and responses, making it easy to emulate a client browser. To enable curl, you must either con- figure PHP by using --with-curl if you are building it from source code, or you must ensure that your binary build has curl enabled. We will talk about user authentication in much greater depth in Chapter 13, “User Authentication and Session Security” but for now let’s evaluate a simple example.You
3. 180 Chapter 6 Unit Testing can write a simple inline authentication system that attempts to validate a user based on his or her user cookie. If the cookie is found, this HTML comment is added to the page:
4. Unit Testing in a Web Environment 181 curl_setopt($this->curl_handle, CURLOPT_COOKIE,$cookie); // execute our query $ret = curl_exec($this->curl_handle); $this->assertRegExp(“//”,$ret); } } // WebBadAuthTestCase implements a test of unsuccessful authentication class WebBadAuthTestCase extends WebAuthTestCase { function _ _construct($name) { parent::_ _construct($name); } function testBadAuth() { // Don’t pass a cookie curl_setopt($this->curl_handle, CURLOPT_COOKIE,$cookie); // execute our query $ret = curl_exec($this->curl_handle); if(preg_match(“/”; } ?>
5. 182 Chapter 6 Unit Testing Hello World. This test is extremely rudimentary, but it illustrates how you can use curl and simple pattern matching to easily simulate Web traffic. In Chapter 13, “User Authentication and Session Security,” which discusses session management and authentication in greater detail, you use this WebAuthTestCase infrastructure to test some real authentication libraries. Further Reading An excellent source for information on unit testing is Test Driven Development By Example by Kent Beck (Addison-Wesley).The book uses Java and Python examples, but its approach is relatively language agnostic. Another excellent resource is the JUnit homepage, at www.junit.org. If you are interested in learning more about the Extreme Programming methodology, see Testing Extreme Programming, by Lisa Crispin and Tip House (Addison-Wesley), and Extreme Programming Explained: Embrace Change, by Kent Beck (Addison-Wesley), which are both great books. Refactoring: Improving the Design of Existing Code, by Martin Fowler (Addison-Wesley), is an excellent text that discusses patterns in code refactoring.The examples in the book focus on Java, but the patterns are very general. There are a huge number of books on qualitative analysis of readability, but if you are primarily interested in learning about the actual formulas used, you can do a Google search on readability score to turn up a number of high-quality results.
6. 7 Managing the Development Environment F OR MANY PROGRAMMERS, MANAGING A LARGE SOFTWARE project is one of the least exciting parts of the job. For one thing, very little of a programming job involves writing code. Unlike the normally agile Web development model, where advances are made rap- idly, project management is often about putting a throttle on development efforts to ensure quality control. Nevertheless, I find the challenges to be a natural extension of my work as a programmer. At the end of the day, my job is to make sure that my clients’ Web presence is always functioning as it should be. I need to not only ensure that code is written to meet their needs but also to guarantee that it works properly and that no other services have become broken. Enterprise is a much-bandied buzzword that is used to describe software. In the strictest definition, enterprise software is any business-critical piece of software. Enterprise is a synonym for business, so by definition, any business software is enterprise software. In the software industry (and particularly the Web industry), enterprise is often used to connote some additional properties: n Robust n Well tested n Secure n Scalable n Manageable n Adaptable n Professional It’s almost impossible to quantify any of those qualities, but they sure sound like some- thing that any business owner would want. In fact, a business owner would have to be crazy not to want enterprise software! The problem is that like many buzzwords,
7. 184 Chapter 7 Managing the Development Environment enterprise is a moniker that allows people to brand their software as being the ideal solu- tion for any problem, without making any real statement as to why it is better than its competitors. Of course, buzzwords are often rooted in technical concerns before they become co-opted by marketers.The vague qualities listed previously are extremely important if you are building a business around software. In this book you have already learned how to write well-tested software (Chapter 6, “Unit Testing”). In Chapters 13, “User Authentication and Session Security,” and 14, “Session Handling,” you will learn about securing software (both from and for your users). Much of this book is dedicated to writing scalable and robust software in a pro- fessional manner.This chapter covers making PHP applications manageable. There are two key aspects to manageability: n Change control—Managing any site—large or small—without a well-established change control system is like walking a tightrope without a safety net. n Managing packaging— A close relative of change control, managing packaging ensures that you can easily move site versions forward and backward, and in a dis- tributed environment, it allows you to easily bring up a new node with exactly the contents it should have.This applies not only to PHP code but to system compo- nents as well. Change Control Change control software is a tool that allows you to track individual changes to project files and create versions of a project that are associated with specific versions of files.This ability is immensely helpful in the software development process because it allows you to easily track and revert individual changes.You do not need to remember why you made a specific change or what the code looked like before you made a change. By examining the differences between file versions or consulting the commit logs, you can see when a change was made, exactly what the differences were, and (assuming that you enforce a policy of verbose log messages) why the change was made. In addition, a good change control system allows multiple developers to safely work on copies of the same files simultaneously and supports automatic safe merging of their changes. A common problem when more than one person is accessing a file is having one person’s changes accidentally overwritten by another’s. Change control software aims to eliminate that risk. The current open source standard for change control systems is Concurrent Versioning System (CVS). CVS grew as an expansion of the capabilities of Revision Control System (RCS). RCS was written by Walter Tichy of Purdue University in 1985, itself an improvement on Source Code Control System (SCSS), authored at ATT Labs in 1975. RCS was written to allow multiple people to work on a single set of files via a complex locking system. CVS is built on top of RCS and allows for multi-ownership of files, automatic merging of contents, branching of source trees, and the ability for more than one user to have a writable copy of the source code at a single time.
8. Change Control 185 Alternative to CVS CVS is not the only versioning system out there. There are numerous replacements to CVS, notably BitKeeper and Subversion. Both of these solutions were designed to address common frustrations with CVS, but despite their advanced feature sets, I have chosen to focus on CVS because it is the most widely deployed open-source change control system and thus the one you are most likely to encounter. Using CVS Everywhere It never ceases to amaze me that some people develop software without change control. To me, change control is a fundamental aspect of programming. Even when I write projects entirely on my own, I always use CVS to manage the files. CVS allows me to make rapid changes to my projects without needing to keep a slew of backup copies around. I know that with good discipline, there is almost nothing I can do to my project that will break it in a permanent fashion. In a team environment, CVS is even more essential. In daily work, I have a team of five developers actively accessing the same set of files. CVS allows them to work effectively with very little coordination and, more importantly, allows everyone to understand the form and logic of one another’s changes without requiring them to track the changes manually. In fact, I find CVS so useful that I don’t use it only for programming tasks. I keep all my system configura- tion files in CVS as well. CVS Basics The first step in managing files with CVS is to import a project into a CVS repository. To create a local repository, you first make a directory where all the repository files will stay.You can call this path /var/cvs, although any path can do. Because this is a perma- nent repository for your project data, you should put the repository someplace that gets backed up on a regular schedule. First, you create the base directory, and then you use cvs init to create the base repository, like this: > mkdir /var/cvs > cvs -d /var/cvs init This creates the base administrative files needed by CVS in that directory. CVS on Non-UNIX Systems The CVS instructions here all apply to Unix-like operating systems (for example, Linux, BSD, OS X). CVS also runs on Windows, but the syntax differences are not covered here. See http://www.cvshome.org and http://www.cvsnt.org for details. To import all the examples for this book, you then use import from the top-level direc- tory that contains your files: > cd Advanced_PHP > cvs -d /var/cvs import Advanced_PHP advanced_php start cvs import: Importing /var/cvs/books/Advanced_PHP/examples