De code in deze blogpost is een refactoring van de BaseHTTPServer-code die je kan terug vinden op de Python-website: http://wiki.python.org/moin/BaseHttpServer. Waarom heb ik die code gerefactored? Omdat er van uit het Clean Code-oogpunt vanalles mis was met de originele versie, met name: duplicate code, functions with too many responsibilities, functions with mixed languages.
Het programma zal een HTTP-server starten op poort 85 en zal ieder URL-pad als antwoord terug sturen. Vrij simpel, maar het vormt een goede basis voor uitgebreidere functionaliteit.
import BaseHTTPServer
HEADER__ContentTypeIsTextHtml = ("Content-type", "text/html") TextHtmlHeaders = [HEADER__ContentTypeIsTextHtml]
def get_address_pair_using_local_host(port_number): return ("", port_number)
class HTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): def do_HEAD(self): self.send_response_and_headers(200, TextHtmlHeaders) def do_GET(self): self.send_response_and_headers(200, TextHtmlHeaders) self.send_path_as_answer() def send_headers(self, headers): for header in headers: self.send_header(header[0], header[1]) self.end_headers() def send_response_and_headers(self, response_code, headers): self.send_response(response_code) self.send_headers(headers) def send_path_as_answer(self): self.wfile.write(self.build_path_answer_string()) def build_path_answer_string(self): return "<html><p>Pad=%s</p></html>" % self.path
class HTTPServer(): def __init__(self, port_number): address = get_address_pair_using_local_host(port_number) self._TheServer = BaseHTTPServer.HTTPServer(address, HTTPRequestHandler) def serve_forever(self): self._TheServer.serve_forever() def serve_until_keyboard_interrupt(self): try: self.serve_forever() except KeyboardInterrupt: pass
PORT_NUMBER_TO_USE = 85 httpd = HTTPServer(PORT_NUMBER_TO_USE) httpd.serve_until_keyboard_interrupt()
Een programma moet je kunnen lezen zoals een boek. De code moet duidelijk zijn, daarom hebben de functies in de bovenstaande programmacode slechts of 1 of 2 verantwoordelijkheden en iedere verantwoordelijkheid wordt vooraf duidelijk gemaakt door de functienaam.
05-08-2011, 22:28
Geschreven door Fibergeek 
|