interface
Details
| Last Update: | 2008-02-05 05:01:23 |
| Version: | 0.03 |
| License/Program Type: | Perl Artistic License |
| Publisher: | Scott Walters |
| Price: | $0.00 |
Description:
SYNOPSIS
package Foo;
use interface 'Iterator', 'Generator', 'Clonable',
'DBI::DBD';
ABSTRACT
Compile-time interface compliance testing. Inspects the methods
defined in your module, and compares them against the methods
defined in the modules you list. Requires no special or additional
syntax.
Should you fail to implement any method contained in any of the
listed classes, compile will abort with an error message.
Methods starting with an underscore are ignored, and assumed
not to be part of the interface.
The modules listed on the use interface line will be added to
your @ISA array. This isn't done to re-use code from them -
interface definitions should be empty code stubs, or perhaps a
reference implementation. It is done so that your module asses the
->isa() test for the name of the package that you're
implementing the interface of. This tells Perl that your module may
be used in place of the modules you implement the interface of.
Sample interface definition:
package TestInterface;
sub foo { }
sub bar { }
sub baz { }
1;
A package claiming to implement the interface "TestInterface"
would need to define the methods foo(), bar(), and baz().
An "interface" may need some explaination. It's an Object
Orientation idea, also known as polymorphism, that says that you
should be able to use interchangeable objects interchangably. Thank
heavens the OO people came and showed us the light!
The flip side of polymorphism is type safety. In Perl,
->isa() lets you check to make sure something is derived from a
base class. The logic goes that if its derived from a base class,
and we're looking for an object that fills the need of the base
class, then the subclass will work just as well, and we can accept
it. Extending objects is done by subclassing base classes and
passing off the subclasses as versions of the original.
While this OO rote might almost have you convinced that the
world works this way, this turns out to be almostly completely
useless. In the real world, there are only a few reasons that one
object is used in place of another: Someone wrote some really
horrible code, and you want to swap out their object with a better
version of the same thing. You're switching to an object that does
the same thing but in a different way, for example using a database
store instead of a flat file store. You're making some minor
changes to an existing object and you want to be able to extend the
base class in other directions in the future. Only in the last case
is inherited code with subclassing even useful. In fact, there is a
move towards using composition (has-a) instead of inheritance
(is-a) across the whole industry, mainly because they got tired of
people pointing out that OO sucks because inheritance only serves
to make a great big mess of otherwise clean code.
Seperating the interface from the implementation lets you make
multiple implementations of an idea. They can share code with each
other, but they don't have to. The programmer has assured us that
their module does what is required by stating that it implements
the interface. While this isn't proof that the code works,
climaing to implement an interface is a kind of contract. The
programmer knows what work is required of him and she has agreed to
deliver on it.
The interface definition can be a package full of stub methods
that don't do anything, or it could be an actual working
implementation of an object you're striving for compatability
with. The first case is cleanist, and the package full of stubs
serves as good documentation. The second case can be handy in cases
where the first case wasn't done but someone ignored the Wisdom of
the Interface and wrote a package anyway.
The Wisdom of the Interface says to write an interface for each
new kind of object that could have multiple implementations. The
interfaces serves as a contract for the minimum features needed to
implement an object of that type. When working with objects -
creating them, checking types when you accept them, etc - always
work with the interface type, never the type of an individual
implementation. This keeps your code generic.
In order to do the composition thing (has-a), you contain one
or more objects that you need to do your work, you implement an
interface that dispatches method calls to those objects. Perhaps
your new() method creates those objects and stores them in instance
variables.
Requirements:
· Perl
0 comments
Add to
interface Version History
Related Software
|
|
From category: Libraries |
| Bigtop::Docs::Cookbook 0.15 is libraries software developed by Bigtop::Docs::Cookbook Team. Bigtop::Docs::Cookbook is a Perl module for Bigtop syntax by example. This document is meant to be... |
|
|
From category: Libraries |
| Device::ISDN::OCLM 0.40 is libraries software developed by Merlin Hughes. Device::ISDN::OCLM is a perl module to control the 3com OfficeConnect LanModem. SYNOPSIS $sp = 1; $pw =... |
|
|
From category: Libraries |
| curlpp 0.6.0 is libraries software developed by Jean-Philippe Barrette-LaPierre. cURLpp is a C++ wrapper for libcURL. libcURL is described as: libcurl is a free and easy-to-use client-side U... |
|
|
From category: Libraries |
| Finance::Currency::Convert::Yahoo 0.2 is libraries software developed by Lee Goddard. Finance::Currency::Convert::Yahoo is Perl mdoule that convert currencies using Yahoo. SYNOPSIS... |
|
|
From category: Version-Control |
| CVS Manager 1.0.0 is version control software developed by AdventNet, Inc.. CodeMiner CVS Manager is a web-based CVS (Concurrent Versioning System) repository monitoring/management and reporting so... |
|
|
From category: Libraries |
| Evolution Sharp 0.12.0 is libraries software developed by Mike Kestner. Evolution is a .NET language binding for various Ximian Evolution libraries. Building & Installing Evolution: \... |
|
|
From category: Localization |
| Archetypes 1.3.6 RC1 is localization software developed by Sidnei da Silva. Archetypes project is a framework for developing new content types in Plone. The power of Archetypes is first in a... |
|
|
From category: Perl-Modules |
| Language::MuldisD contains a formal spec of Muldis D relational DBMS language.... |
|
|
From category: Preprocessors |
| EmPy 3.3 is preprocessors software developed by Eleventh Hour. EmPy is a system for embedding Python expressions and statements in template text; it takes an EmPy source file, processes it, and pro... |
|
|
From category: Libraries |
| Convert::Braille::Ethiopic 0.05 is libraries software developed by Daniel Yacob. Convert::Braille::Ethiopic is a Perl module that can convert Between Braille Encodings. SYNOPSIS use... |
|
|
From category: Perl-Modules |
| Python::Object is a Perl module that encapuslate Python objects.... |
|
|
From category: Libraries |
| fb_mhash 1.2 is libraries software developed by Richard Kotal. fb_mhash is a UDF library for Firebird/Interbase. fb_mhash implements an interface to the mhash library (libmhash). It support... |
|
|
From category: Libraries |
| Audio::TagLib::MPC::File 1.42 is libraries software developed by Dongxu Ma. Audio::TagLib::MPC::File is an implementation of Audio::TagLib::File with MPC specific methods. SYNOPSIS... |
|
|
From category: Libraries |
| Class::InsideOut 1.02 is libraries software developed by David A. Golden. Class::InsideOut is a Perl module with a safe, simple inside-out object construction kit. SYNOPSIS package... |
|
|
From category: Assembler-Tools |
| ccontrol 0.9.0 is assembler tools software developed by Rusty Russell. ccontrol program takes over the roles of the compiler and linker, and reads a configuration file to decide what to do before i... |
Leave a comment