'분류 전체보기'에 해당되는 글 539건

  1. 2003.08.04 [Music] MI3P
  2. 2003.08.04 [Music] What is a GRid?
  3. 2003.08.04 [Music] ISBN 1
  4. 2003.08.04 [Music] What is a DOI?
  5. 2003.08.04 [Music] What is the ISRC?
  6. 2003.08.04 [Music] PII
  7. 2003.08.04 [Music] What is the ISAN?
  8. 2003.08.04 [Music] What is an ISWC?
  9. 2003.08.04 [Music] What Is an ISMN?
  10. 2003.08.04 [Music] 해외의 Music 라이브러리 및 식별 관련 업체 및 단체들
  11. 2003.08.04 [ID3] 음악 식별 관련.
  12. 2003.08.03 Refactoring Workbook - Source Code
  13. 2003.08.03 Refactoring Workbook
  14. 2003.08.03 Refactoring To Patterns
  15. 2003.08.03 Errata for Refactoring
  16. 2003.08.03 Wrap entities with session (Link only)
  17. 2003.08.03 Use a Connection Pool (Link only)
  18. 2003.08.03 Substitute Algorithm
  19. 2003.08.03 Split Temporary Variable
  20. 2003.08.03 Split Loop (by Martin Fowler) <IMG SRC = "http://www.refactoring.com/catalog/new.gif" border=0>
  21. 2003.08.03 Separate Query from Modifier
  22. 2003.08.03 Separate Data Access Code (Link only)
  23. 2003.08.03 Self Encapsulate Field
  24. 2003.08.03 Reverse Conditional (by Bill Murphy and Martin Fowler) <IMG SRC = "http://www.refactoring.com/catalog/new.gif" border=0>
  25. 2003.08.03 Replace Type Code with Subclasses
  26. 2003.08.03 Replace Type Code with State/Strategy
  27. 2003.08.03 Replace Type Code with Class <IMG SRC = "http://www.refactoring.com/catalog/updated.gif" border=0>
  28. 2003.08.03 Replace Temp with Query <IMG SRC = "http://www.refactoring.com/catalog/updated.gif" border=0>
  29. 2003.08.03 Replace Subclass with Fields
  30. 2003.08.03 Replace Static Variable with Parameter (by Marian Vittek) <IMG SRC = "http://www.refactoring.com/catalog/new.gif" border=0>

[Music] MI3P

2003. 8. 4. 02:14
Music Industry Integrated Identifier Project
  
With the spectacular growth of the use of digital music, authors' societies have decided to join their efforts with all the major players of the industry. CISAC, together with BIEM announced their agreement to develop a global identification scheme for digital musical content in co-operation with RIAA and IFPI.

This project, called Music Industry Integrated Identifier Project (MI3P) shall design a system for identifying transactions involving sound recordings in an electronic environment, enabling the delivery of online music to consumers and the management of the associated rights.

M3IP aims to elaborate a user-friendly system. Consumers rights are of prime concern. Everybody should have access to the music he or she loves in an environment with growing numbers of digital music providers and increasing diversity of distribution methods. In support of consumers, the project thus sets out to make legitimate and exciting content widely available online.

The corner stone of the project is a number, that uniquely identifies a creation, the individuals and companies involved in its exploitation and ownership, as well as the associated rights. If embedded into each digital sound recording, the identifier will enable to permanently associate the recording with an extensive set of rights related information.

Another important aspect of the design shall be its ability to inter-operate, meaning that it will be integrated or closely linked with existing identification systems, such as CISAC's International Standard Musical Work Code (ISWC) and the record industry's International Standards Recording Code (ISRC). Moreover, it will be compatible with CISAC's Common Information System (CIS), based on the standardisation of information exchange between collective management societies.

Contact CISAC's representative to the MI3P project: fx.nutall@cisac.org





***** 아름다운프로님에 의해서 게시물 복사 + 카테고리변경되었습니다 (2003-12-18 17:01)
Posted by 아름프로
What is a GRid?

GRid is the acronym for the Global Release Identifier, which is a new identifier that will identify electronically distributed music. These releases may be single tracks, an album or multi-media packages.
Why is this needed?

The increased use of the Internet to distribute music has presented new problems, which the current identification systems in use do not meet.
Why use GRids and not some other identifier?

Although tracks are being traded and released electronically there is currently no standard means of identifying them. Many of those involved are using different identifiers, which makes communication about the assets and their tracking through the value chain very difficult. GRid is a standard means of identifying the fundamental unit of trade in the electronic environment - the release.
What are these new problems?

The electronic distribution of music has meant that producers are now required to manage far more information about the releases and the intellectual property that they contain. This information can include descriptive data about the content, the performing artists, composer and other contributors, the terms and conditions of licenses and other associated rights.
Who can use a GRid?

Anyone involved in the electronic distribution of music; such as record companies, legitimate online music providers and retailers.
Will GRid help with online piracy?

The use of GRID will help legitimate services to operate on the Internet and provide a legal alternative to pirate sites and file sharing services.
What is the difference between an ISRC (International Standard Recording Code) and a GRid?

The ISRC identifies the individual sound and music video recordings, whereas the GRid identifies the product or release that these recordings are part of. GRid acts as an electronic Unique Product Code (UPC) number - as used on CDs. For example: The same song on the release of an album and on a greatest hits compilation has the same ISRC, but the two releases will have different GRids.
Will GRid replace the ISRC?

No. They identify different things. In fact GRid actually furthers the use of the ISRC, because in order to allocate a GRid to a release ISRCs will need to have been issued to all the sound and music videos contained in the release.
How can I get a GRid?

To begin allocating GRids, users need to apply for an Issuer Code from the GRid Registration Agency (www.ifpi.org/grid). The Issuer Code is one of part of the overall identifier and it will uniquely identify the individual or company that will be identifying their releases with GRids.
How is a GRid structured?

The identifier is alphanumeric, 18 characters in length and has a fixed format. The first two parts are allocated by the GRid Registration Agency and the last two by the user themselves.




***** 아름다운프로님에 의해서 게시물 복사 + 카테고리변경되었습니다 (2003-12-18 17:01)
Posted by 아름프로

[Music] ISBN

2003. 8. 4. 01:58
ISBN ..
The ISBN is a unique machine-readable identification number, which marks any book unmistakably. For 30 years the ISBN has revolutionized the international book-trade. 159 countries and territories are officially ISBN members


About Information Standards



During the nineteeth century there developed in the U.K. and the U.S. pioneering efforts to systemize and cumulate the catalogs of publishers' output, to the benefit of booksellers, wholesalers and librarians. The current manifestations of this development are to be found in "Whitaker's Books in Print" in the U.K., R. R. Bowker's "Books in Print" in the U.S. and Bowker's "Global Books in Print on Disc" which combines the world's top six English-language book databases on a monthly CD-ROM disc--an international bibliography which not only profiles all titles currently in print in the English-language market, but also links each of them with their publisher.

The work that led to these great current bibliographies of English-language publishing was based at least partly on the premise that maintaining a smooth flow of accurate information about the various aspects of the publishing industry helps to keep this industry healthy. The development of and adherence to standards has always been crucial to creating and maintaining this flow of information. This statement was true for the Amherst College librarian Melvil Dewey. It was also true for David Whitaker and Emery Koltay when they introduced and implemented what is probably the most important standard of all, the ISBN. What would the modern computerized publishing industry look like if we did not have the ISBN to identify each iteration of the titles actively in circulation? This question becomes even more significant when you place it in the perspective of 50,000 new products each year - which is the (rather amazing) output of the U.S. publishing industry over the last few years. This characteristic of the publishing industry, that each new title, new edition, new binding, is treated as a separate new product is one of the major obstacles to unique and meaningful product data transmission within the publishing industry. It is also one of the major reasons that we must set up standards such as the ISBN and the SAN for our systems and comply with them.

We at the Bowker agencies take standards very seriously, and we are very happy that you are visiting our web site. We hope that we have provided the information that you need to understand and participate in the ISBN and SAN systems. Let us hear from you.


Basmatti.gravesande@bowker.com



***** 아름다운프로님에 의해서 게시물 복사 + 카테고리변경되었습니다 (2003-12-18 17:01)
Posted by 아름프로
1. What is a DOI?
    
A Digital Object Identifier -- a digital identifier for any object of intellectual property.  A DOI provides a means of persistently identifying a piece of intellectual property on a digital network and associating it with related current data in a structured extensible way.

A DOI can apply to any form of intellectual property expressed in any digital environment.  DOIs have been called "the bar code for intellectual property": like the physical bar code, they are enabling tools for use all through the supply chain to add value and save cost.

A DOI differs from commonly used internet pointers to material such as the URL because it identifies an object as a first-class entity, not simply the place where the object is located.  The DOI identifies an entity directly, not some attribute of an object (an address is an attribute of a thing, whereas the thing itself is a first class object).

A DOI also differs from commonly used identifiers of intellectual property such as standard bibliographic and related identifiers (ISBN, ISRC, etc) because it can be associated with defined services and is immediately actionable on a network.    

A DOI is an implementation of the Internet concepts of Uniform Resource Name and Universal Resource Identifier.  A DOI differs from abstract naming specifications such as URI in that it is a defined implementation complete with social and technical infrastructure, ready to use.

For more on this topic, see the DOI Handbook chapters Introduction and Numbering.

    


    2.What can be identified by a DOI?
    

A DOI can be used to identify any resource involved in an intellectual property transaction.   Intellectual property includes both physical and digital manifestations, performances and abstract works. An entity can be identified at any arbitrary level of granularity.  DOIs can be used to identify, for example, text, audio, images, software, etc; and in future could be used to identify the agreements and parties involved. While the scope of intellectual property transactions is quite broad, it is unlikely that DOIs would be appropriate for identifying entities such as people or natural objects or trucks  unless they are involved in such a transaction.  Intellectual property transactions don't necessarily involve money: DOIs can be used to identify free materials and transactions as well as entities of commercial value.

A DOI is an implementation of URI (Uniform Resource Identifier, sometimes called Universal Resource Identifier, IETF RFC 2396).   It uses the Handle system for resolution of the identifier, and the indecs framework for metadata description.  The syntax of the DOI is specified by a NISO standard, (ANSI/NISO Z39.84).

While a DOI can therefore be used like any other URI to identify "anything that has identity", the DOI system is a combination of components (identification, resolution, metadata and policies) devised with the specific primary aim of identifying any "intellectual property entity".   The initial focus of DOI applications was "Creations" -- that is, resources made by human beings, rather than other types of resource (natural objects, people, places, events, etc).  However these other types of resource are also necessarily involved in intellectual property transactions, and so may be identified by DOIs where appropriate.   As an example, the initial aim of DOI was not to be used to identify natural objects (e.g. specimens in a natural history museum, or natural substances used in pharmaceutical research): but if these were involved in intellectual property interactions there may be an application of DOI to museum artefacts or pharmaceutical components which would be appropriate.  Similarly, DOI was not initially an identifier for agreements or licences, but implementers may find it useful to identify these with DOIs alongside the intellectual property that they govern.



Formally, DOI scope is defined in terms of a data model underlying the indecs analysis: a DOI can be assigned to any entity which is a Resource within the indecs model of e-commerce.  This means the type of entity must be described in terms of attributes in the dictionary (e.g., media, mode, content, subject), and become an entry in the indecs Data Dictionary used by the DOI system. The practical outcome of this is important and provides a pragmatic functional specification: a DOI can identify any Resource, but the DOI system requires that the Resource is defined (technically and hence precisely) in terms of agreed public (iDD) attributes. This is one role of the DOI metadata.



Within the world of intellectual property entities as resources, the primary focus of DOI has been on the identification of a Creation. The metadata component of the DOI uses the concept of a Kernel set of metadata. The kernel metadata as currently defined relates only to Creations, and a different kernel will need to be defined for fundamentally different Resources or entities such as parties, places or agreements.  There is no problem in principle in doing this as the concepts are analogous; it may be a logical and necessary step  (e.g. if a DOI Registration Agency wishes to use DOIs to identify individual licence agreements, authors, consumers, etc).


    For more on this topic, see the DOI Handbook chapter Introduction.
    
    


    3. How do I assign a DOI?
    
  

     A DOI prefix (for example, 10.1000/) enables a registrant to assign many DOIs, by building on the prefix to construct a range of unique identifiers (10.1000/abc, etc).   To obtain a DOI Prefix, you need to work either with a DOI Registration Agency or, for experimental or prototype purposes, with the International DOI Foundation.



Working with a Registration Agency brings with it the advantages of participation in a defined DOI application with others.   Several DOI Registration Agencies have been appointed, and additional DOI Registration Agencies will be appointed.



DOIs allocated using prefixes purchased directly from IDF are registered without structured metadata: there is no metadata support and no social infrastructure support of the type which can be given by a Registration Agency.  DOI prefixes obtained directly from IDF may however be useful if you wish to experiment in developing your own applications. Prefixes will only be issued using the direct route at the discretion of the IDF.




For more on this topic, see the DOI Handbook chapters Registration Agencies and
Operating Procedures.

      
  
      
    4. How much does it cost to assign a DOI?
    

Registration Agencies (RAs) are free to set fees independently of the IDF.  This allows a range of pricing and business models using third part registration agencies, in recognition of the fact that a simple model is not a "one size fits all" solution.  Many RAs will be assigning DOIs as part of a wider service offering to customers in which DOI registration may not be a separately specified item.  Registration Agencies participate in the DOI System by paying fees (of the order of a few cents per DOI) to support central activities of the IDF.



There is no limitation placed on the number of DOI prefixes that any organization may choose to apply for.  DOI Prefixes will only be issued using the direct route at the discretion of the IDF.


For more on this topic, see the DOI Handbook chapters IDF,
Registration Agencies, and Operating Procedures.
      

    
    5. Why do I need a Registration Agency to assign DOIs?
    
      
Registration Agencies (RAs) are established to provide services on behalf of specific user communities. CrossRef, for example, is providing citation-linking services for the scientific publishing sector, so publishers will choose CrossRef as their Registration Agency if they wish to use the specific service or services offered by CrossRef.  Choosing an appropriate RA will give you access to DOI services and implementations offered by the RA for that community.



RAs may offer sectoral specialisms of this kind, which may have global application; or may offer regionally based services such as local language support. The smooth running of the DOI System requires close collaboration between different RAs so that registrants can avail themselves of the full range of services that are offered.


If you cannot identify an appropriate Registration Agency able to meet your specific needs please contact us.  The IDF will act as a "default" Registration Agency for the foreseeable future, to host registration of such DOIs until an appropriate Registration Agency can take over.  IDF can also form working groups of like-minded organisations who may wish to establish a collaborative activity to form an RA, and stimulate the development of business opportunities. It will not compete with RAs that have an established market position.

For more on this topic, see the DOI Handbook chapter Registration Agencies.

For more on this topic, see the DOI Handbook chapter  
Registration Agencies.

      

      
    

    
    6. How do I become a member of the International DOI Foundation?
    
    
Members of the DOI Foundation are organizations (not usually individuals).  Membership requires payment of an annual subscription, which varies by category of membership.  The International DOI Foundation is similar in some ways to other development organisations such as the World Wide Web consortium.



For more on this topic, see the DOI Handbook chapter Introduction.  


      
      

      
    7. What is resolution and why is it important?
    
    
The process in which an identifier is the input (a request) to a network service to receive in return a specific output of one or more pieces of current information (state data) related to the identified entity: e.g. a location (such as URL) where the object can be found.   A name (or unique identifier) for a digital object enables that name to be resolved to one (or many) of several different pieces of data which may be associated with the digital object.  Such pieces of data can be locations of the object, or services about the object, or any other defined piece of data.  Resolution enables a single name (the identifier, DOI) to be used persistently to manage the object, even if any of those pieces of data (like location) change.   Resolution therefore (a) enables persistence and (b) enables multiple services to be directly associated with the DOI.



For more on this topic, see the DOI Handbook chapter Resolution.
      
      
      

      
      8. What is metadata and why is it important?
    
    
Metadata is related data about the object.  Identifiers are simply names -- names that follow a strict convention and are unique if properly applied, but names just the same. Unique identifiers are particularly valuable in machine-mediated commercial environments, where unambiguous identification is crucial.



Some identifiers tell you something about the thing that they identify -- for example, since "ISBN" is the acronym of "International Standard Book Number", the identifier "ISBN 1-900512-44-0" can reasonably safely be assumed to identify a book (always assuming that ISBN rules have been correctly followed, which is not universally the case).  However, to find out which book it identifies, it is necessary to consult metadata -- the identifier links the metadata with the entity it identifies and with other metadata about the same entity. Metadata is an integral part of making the identifier useful.




For more on this topic, see the DOI Handbook chapter Metadata.
      
      
      

    
    9. Who is using the DOI system today?
  
    
    
Several hundred different registrant organizations have so far allocated several million DOIs.  Because the origins of the DOI were in the text sector, an initial large implementation covering half of these registrants was from traditional print-publishing companies that have already established major online publishing programs.



However the fundamental design of the system is applicable to any media or content. The IDF is working closely with many businesses in other sectors of the "content industries" to extend the application of the DOI to many other types of intellectual property.
    

For more on this topic, see the DOI Handbook chapter Registration Agencies.
      

    
    10. What is the role of the International DOI Foundation?
  
      
      
The IDF governs the DOI System, to ensure that all applications follow common rules.  The system itself has several components: the technology is based on open agreed standards, while the infrastructure is defined by agreements between the various organisations which run the system, such as the Registration Agencies and the technology providers.  Each Registration Agency is autonomous and the IDF has no role in determining an RAs business model or governance.



The Foundation was created in 1998 and supports the development and promotion of the Digital Object Identifier system as a common infrastructure for content management. The Foundation is controlled by a Board elected by the members of the Foundation, with an appointed full-time Director who is responsible for co-ordinating and planning its activities. Through the elected Board, the activities of the Foundation are ultimately controlled by its members. Membership is open to all organizations with an interest in electronic publishing and related enabling technologies.



For more on this topic, see the DOI Handbook chapter The International DOI Foundation.


      
      

      
    

    11. Are there any guidelines on how to make up the identifier?
    
      
The DOI syntax is a NISO standard, but allows the incorporation of any form of existing identifier. The DOI suffix can be any alphanumeric string that the Registrant chooses. This can simply be a sequential number, or it can make use of an existing (legacy) identifier. The latter may often be administratively convenient for the Registrant.  



For more on this topic, see the DOI Handbook chapter Numbering.
    
      
      

      
   12. Does a DOI include a check digit?
  
      A check digit is not compulsory or necessary, but if you wish to include one you may.   Identifiers such as URL and URI specifications, deriving from an Internet environment, do not have check digits: the underlying TCP/IP protocol they use has an error-correction component.   Identifiers such as ISBN and similar bibliographic or documentation identifiers do have check digits: these act as aids to readability or keyboard data entry in the absence of any automated protocol correction.

DOI is deliberately designed as an opaque string, so that it is suitable for any use. The DOI system does not itself make use of check digits. However, other applications may: so if you wish to incorporate a checksum digit into a DOI you may.   This could be useful for some other application. You may use as the suffix an existing string with a checksum (e.g. ISBN). You can also calculate the checksum across the whole DOI if you wish (that would be akin to what the EAN/UPC does when it encapsulates an ISBN). Such a use of checksums in a particular DOI application could be a rule of the DOI Application Profile concerned: "your DOIs must include a checksum".





For more on this topic, see the DOI Handbook chapter Numbering.




      
   13. What is the relationship between a DOI and other standards?
  
      
The Digital Object Identifier (DOI) is a system for resolution of identifiers to global services.    It uses open standards such as the Handle system and indecs framework, and can integrate with existing identifiers (they can be incorporated as a suffix into a DOI) and with other network services.   DOI builds on open Internet standards and works with information industry bodies wherever possible to ensure compatibility and interoperability.    



For more on this topic, see the DOI Handbook chapters Introduction, Numbering,
Resolution and Metadata.


      

      
      14. What is the relationship between a DOI and other development efforts?
    
      
The International DOI Foundation is a member of some standards organizations, and maintains a number of liaisons or alliances through memberships and/or exchange of information with others, which allow us to act as a collaborative interface in discussions on standards and infrastructure development across the spectrum of intellectual property and technology communities. This provides advantages both to members of the Foundation (who may otherwise not be able to participate in all of these discussions) and to the strategic partners (who deal with IDF as a common voice for the intellectual property community in this area).



The IDF participates in the management and governance of two technology development activities where it is a major user: the Handle System, and the indecs framework.  



In addition the IDF has a number of other relationships with significant development and standards activities in many areas of intellectual property and technology. Some of these are specific to particular application areas, and are undertaken in order to seed activities and outreach from the DOI to potential implementations. This list is expanding and we welcome expressions of interest from organizations who wish to establish such a relationship.




For more on this topic, see the DOI Handbook chapter The International DOI Foundation.


      

      
      15. What is the relationship between the DOI System and the Handle System?
    
      

The DOI system is an application of the Handle System (a resolution system) to intellectual property. It is more than the Handle System: it adds to the Handle System an approach based on structured associated metadata, policies, procedures, business models and application tools. Initial implementations are now being supplemented by increasingly sophisticated value-added tools for metadata management and content management, which will use the Handle System multiple resolution function.  The IDF participates in the management and governance of the Handle System, together with other stakeholders.


    
  
For more on this topic, see the DOI Handbook chapter Resolution.



Additional Handle System FAQs can be found on the Handle System Web site.

      
      

    
    16. What is the relationship between the DOI System and the indecs framework?
    
    
DOI is an implementation of the indecs metadata framework.  In addition, IDF participates in the management and governance of the indecs framework, together with other stakeholders.  IDF is one of the organisations which developed the original indecs framework and is now developing it further.  The indecs approach is fundamental to DOI's design.

      

For more on this topic, see the DOI Handbook chapters Metadata and The International DOI Foundation.



      
      

      
   17. How do I participate in DOI development?
    
    
Options include: working with a Registration Agency and obtaining a DOI prefix and assigning DOIs on an experimental basis; joining an IDF working group to work with others in a defined problem area; or joining the IDF as a full member, with rights to participate in all working groups.




For more on this topic, see the DOI Handbook chapters Registration Agencies and The International DOI Foundation.



    
    

    
   18. Is the DOI relevant to rights transactions?
    
      
Yes.  Fundamental to rights transactions are the concepts of unique identification and appropriate structured metadata.   DOI implements the indecs approach, which has at its heart the concept of rights management.   IDF has introduced the concepts of DOI and indecs into many digital rights management activities such as MPEG-21, OEBF, TV-Anytime, etc.    



For more on this topic, see the DOI Handbook chapters Metadata and The International DOI Foundation.



      
    

    
    19. How do I develop a DOI Application?
    
    
Applications can range from DOIs being a persistent redirection to a single URL (which is easily accomplished) to advanced applications and services.  DOI multiple resolution and defined metadata in Application Profiles ensure interoperability; the starting point for such advanced applications is the registration of a set of metadata appropriate to the particular community use being conceived. An  Application Profile is built in a structured way using the principles of indecs.  DOI does not mandate a single metadata standard; you may use any existing metadata standard; it does however require that for full interoperability the metadata set be mapped to the indecs Data Dictionary.




For more on this topic, see the DOI Handbook chapters Metadata and Applications.


  

  
  
   20. Does the IDF intend to restrict in any way the usage of the DOI System?
  
    
There are very few restrictions placed on DOI applications.   However they must abide by the rules of the IDF, and must be applications which respect appropriate legal frameworks of intellectual property such as those of the World Intellectual Property Organisation.  



Some restrictions have been placed temporarily, designed to ensure that the system expands in a controlled way: for example, initial applications were restricted to single point resolution (this restriction has now been lifted); DOIs are currently applied to any creation, but not yet to entities such as people and agreements.  The DOI concept could be applied to any such entity but our initial applications were confined to describing the intellectual property rather than its users or uses as this area is the best developed and the one where most need has been demonstrated.



Registration Agencies and registrants abide by rules of the system, which are intended solely to maintain a level playing field. These mandate policy rules - for example that no consolidated data about use of a specific DOI is made public or available to other than the registrant.   They also mandate rules as to syntax and services.  



For more on this topic, see the DOI Handbook chapter Policy.

      
      
      

      
   21. Can't I do all of this with current technologies on the Web?
    
    
No. DOIs are designed for use in any digital networks, not just the World Wide Web, which is only one recent aspect of the evolution of digital networks and the use of digital objects within them.  DOIs can be used in open or proprietary digital networks in broadcasting, multimedia systems, or indeed any conceptual framework.   DOIs can be thought of as an abstract specification which have a reference implementation in the current internet technologies.



Even on the Web, only some aspects such as single redirection can be accomplished with some existing technologies. Developing concepts such as Web Services promise to make available other tools; Metadata tools such as RDF may eventually be readily usable to describe indecs relationships: we welcome these as synergistic efforts.  However no other current technologies offer the same packaged combination of multiple resolution; well-formed metadata; semantic analysis and mapping to metadata schemes; social infrastructure; and non-proprietary non-commercial operation supported by a wide range of content and technology providers.  


Since identifiers like DOIs deliberately set out to provide advantages over existing, but widely deployed and implemented, mechanisms such as DNS and http, they need to be able to use those existing mechanisms.  This is done via gateways into those existing widely implemented schemes.   A gateway provides a means of accessing the functionality of one server through another.  For example, a DOI proxy server (http://dx.doi.org) is used to convert DOI requests into http requests and vice-versa.


For more on this topic, see the DOI Handbook chapters Numbering and Resolution.


      
      
    

    
    22. I'm not an original publisher or producer of information: can I use the DOI System?
    

Yes: DOIs can be used by anyone, independent of the applications that may have been originally devised by the registrant. Particular communities may develop applications which involve assigning DOIs not by the original publisher but by other parties appropriate to that sector of interest. DOI users can be at any point in an information chain -- intermediary, retailer, user, producer, agent, etc, in the same way as the physical bar code is useful to (and used by) a range of retailers, logistics companies, re-sellers etc even though the code is originally assigned by a manufacturer.



Of course, we need to ensure that we don't get every party in the supply chain assigning their own DOIs to the same entity, which would be inefficient.   This is obvious in the case of existing identifiers (for example, ISBNs are assigned to books by the publisher, using the ISBN agency, not by authors, booksellers, wholesalers or libraries).  But it may not be obvious in the case of new areas where the supply chain rules have yet to evolve: here there may need to be some discussions and agreement in the community about what identifiers are allocated by who.    Even in traditional supply chains, there may be other related and relevant identifiers used by people other than the DOI assigner (like stock-keeping units (SKU) identifiers, pallet identifiers, publisher identifiers, library catalogue numbers, etc.   New  linkages may also arise between these, and they can be carried out through DOIs.



The DOI system can help to ensure smooth operation in these supply chains by defining business rules for a particular DOI Application Profile.  These can state who in the supply chain is responsible for assigning a DOI in that particular application: rules agreed and defined by the user community, not by the IDF.  The DOI system can also help by creating automated links: if there are related DOIs in other Application Profiles a link can be made using DOI multiple resolution; if there are other forms of identifiers not in the form of DOIs, like SKUs, these can be carried as part of the DOI metadata.  




For more on this topic, see the DOI Handbook chapters Numbering and Resolution.


    
    

    
    23. How does DOI metadata relate to the Dublin Core Metadata Initiative?
    

Dublin Core aims to be an easy-to-create and maintain descriptive format to facilitate cross-domain resource discovery on the Web.  "Qualified Dublin Core" supports the use of DC elements as the basis for extended but simple statements about resources, rather than as a foundation for more descriptive clauses. Complex descriptions may be necessary for some Web resources and for some purposes, such as administration, preservation, and reference linking. However, complex descriptions require more expressive data models that differentiate between agents, documents, contexts, events, and the like. This is achieved through the indecs model.  While DC starts from a small group of "core" elements, and DOI Application Profiles include a small group of "kernel" elements, the two do not serve the same purpose.  The DOI kernel is derived from a comprehensive data model and has strict rules for mandating implementation.  The DOI Resource Metadata Declaration provides a tool set for extending metadata declarations to any desired set of entities, comparable therefore to DC-qualified but with the significant difference of a basis in an underlying comprehensive semantics to ensure consistency of all declarations for any purpose.



Any DC scheme may be used as the basis for developing a DOI Application Profile, though the DC metadata may need to be supplemented or further defined in the mapping to the indecs Data Dictionary, depending on the precision with which the DC term has been defined.  



The DOI Metadata System enables semantic interoperability between APs devised for any purpose (not only simple description but more complex events), so that "cross-domain" tools and applications (those which reference DOIs across more than one AP) can do so consistently and effectively. Such semantic interoperability will be required for widespread digital use of information from multiple sources.



For more on this topic, see the DOI Handbook chapter Metadata.

    
      


24. Where do you put a DOI and what does it look like to a user?


You may put a DOI anywhere you like.  A DOI may be printed or made explicit within a digital object; or it may be hidden by e.g. underlying a hyperlink.  Therefore it can either appear as a DOI, or the user may never know that a DOI has been used to "power" her transaction.


For more on this topic, see the DOI Handbook chapter Numbering.


      


25. How do I use a DOI in a Web Browser?


Applications using DOI can be constructed on a web site with full functionality behind the scenes. For some applications, this may require additional functionality such as that supplied in the Handle system: users may find it helpful to load a small free plug-in if the browser they are using does not support URN resolution.  DOIs are URIs (URNs) not URLs: the distinction is that they are names not locations.  Most web browsers support locations (URLs) but have limited functionality for names, though this is expected to improve substantially in the near future.  However, DOIs are useable with browsers immediately:



There is a freely available "resolver plug in" that can be downloaded from http://www.handle.net/resolver/. For both Netscape and Microsoft IE browsers, the plug-in extends the browser's functionality so that It will recognize a DOI in the form "doi:10.1000/123", and resolve it to a URL or other file type the browser recognises. The user simply "clicks" on the DOI (or types the DOI into the address line in their browser) and the DOI is resolved directly.



Alternatively, without the need to extend their web browsers' capability, users may resolve DOIs that are structured to use a DOI proxy server (http://dx.doi.org), which "translates" a name using URL syntax.  The resolution of the DOI in this case depends on the use of URL syntax: for example doi:10.1000/123 would be resolved from the address: "http://dx.doi.org/10.1000/123". Any standard browser encountering a DOI in this form will be able to resolve it.



Many browsers, such as IE6, support URNs as bookmarks, so DOIs can be saved in that form.  



For more on this topic, see the DOI Handbook chapter Resolution.


      


26. What is the relationship between DOI and XML?


The DOI System makes use of XML (eXtensible Markup Language), and XML is entirely compatible with DOI. The expression of DOI metadata in XML is recommended both for kernel metadata and for DOI Application Profile metadata extended from the kernel.  The indecs data dictionary and the DOI Resource Metadata declaration both allow the use of XML expressions, commonly used for metadata transport and messaging.  



It seems likely that the relationship between DOI and XML will grow over time.  One obvious link is in developing DOI Application Profiles for the various emerging XML schemas for industry-specific uses, such as NewsML: when such a scheme has been developed, DOIs provide an obvious way of adding functionality (persistent identification, interoperable metadata mappings, multiple resolution framework, etc.) to that schema for practical uses.



The linking of entities in XML is very different to the linking of entities with DOIs, as the two serve different, complementary purposes.  XML entity resolution is concerned with the construction of an XML document or message; it exists to support the assembly of XML documents from components. DOI resolution, on the other hand, deals with information about an identified entity and linkage of intellectual property entities and information about those entities.  DOIs may of course be used to identify entities which are "marked up" in an XML schema; but not every tagged entity in an XML schema may merit a DOI, unless there is a need for separate management of that entity (functional granularity).



Several languages have been constructed using XML that support functions complementary to DOI: e.g. XLink is a language that allows XML elements to be made into links, which specify relationship types and behaviour characteristics between sets of resources; the Resource Description Framework is another language that can be expressed in XML and allows properties of an identified resource to be described. Although neither of these technologies are yet mainstream, they have similar characteristics to, and can be used with, DOIs.   The IDF is actively pursuing such usages and monitors XML developments closely.



For more on this topic, see the DOI Handbook chapter Metadata.


      


27. How can the DOI be used to locate my specific local copy, which may have
different access rights?



The Digital Object Identifier (DOI) is a system for resolution of identifiers to global services. However it can be used with other complementary technologies, such as OpenURL, to allowing the contextualization of requests to those services to local requirements.



Registration Agencies such as CrossRef offer practical implementation of the DOI with such local linking technology.  A typical example is that a library may well wish to resolve to a specific instance of a content item  -- such as a cached copy which it has access rights to -- rather than a publisher-held "generic" copy.  It is appropriate to split this into separate global and subsequent delegated local resolution steps, since a globally-maintained database is clearly the wrong place to hold information on every local collection.  


Basic OpenURL write up can be found at http://www.crossref.org/03libraries/16openurl.html.


It is also possible to deal even with individual copies by identifying them by DOIs, though it may not always be appropriate. DOIs can be used to identify any resource: in CrossRef for example, the DOI is allocated to the abstraction representing the article work (that is, different formats etc such as pdf versus Word are not separately identified: we can think of the DOI as identifying the class of all formats and copies). In other applications, different DOIs might be allocated to different formats, or even to individual instances.  



For more on this topic, see the DOI Handbook chapter Resolution.






28. "Persistent identification" is an accepted concept:
what does the DOI add to this?



The need for persistent identifiers is well recognised in many areas (particularly from the library, archives, and government communities), but the next step (adopting a practical implementation such as DOI) is not yet so readily comprehended.  There is a fundamental difference between recognising the need for persistent identifiers through a technical scheme (like URN), and the practical implementation of this (which inevitably has associated costs but also associated added value: a DOI is a URN and URI implementation).   The key point is not about DOI "versus" an alternative scheme; it is about technical versus business infrastructure, and the need for additional implementation work for the use of any persistent identifier.  



The implementation of persistent identifiers adds value, but necessarily incurs some costs (in number registration, infrastructure maintenance, and governance).   There is a widespread recognition of the advantages of assigning identifiers; and a widespread misconception that an abstract specification (like a URN or URI) actually delivers a working system rather than a namespace that still needs to be populated and managed.  A common misperception is that one can have such a system at no cost.  It is inescapable that a cost is associated with managing persistence and assigning identifiers and data to the standards needed to ensure long-term stability.  



If adding a URL "costs nothing" (which itself ignores some infrastructure costs), why should assigning a name?  It is indeed possible to use any string, assigned by anyone, as a name -- but to be useful and reliable any name must be supported by a social as well as technical infrastructure that defines its properties and utilities.  URLs for example have a clear technical infrastructure (standards for how they are made), but a very loose social infrastructure (anyone can create them, with the result that they are unreliable alone for long term preservation use as they have no guarantee of stability let alone associated structured metadata).  Product bar codes, Visa numbers, and DOIs have a tighter social (business) infrastructure, with rules and regulations, costs of maintaining and policing data -- and corresponding benefits of quality and reliability.



Like any other piece of infrastructure, an identifier system (especially one which adds much value like metadata and resolution) must be paid for eventually by someone. The DOI is designed to work with any business model, ranging from free assignment to assignment on a commercial basis.  



For more on this topic, see the DOI Handbook chapters Introduction and Policy.





29. What data is associated with a DOI?


The simplest DOIs (such as those in the earliest implementations of DOI) are essentially redirection from a persistent name (the DOI) to a changeable URL.   The information associated with the DOI in the DOI system is therefore simply the URL and relevant administrative information for managing the DOI.  These are now known as DOIs of the Zero Application Profile.  



However, in more sophisticated applications, a DOI has additional associated data which help characterise the identified entity and which can be used to build services related to the identified entity. The Application Profile (AP) is a key example of such additional data. APs are used to group sets of DOIs which have similar characteristics, such as the same metadata schemas and business rules for DOI assignment. Thus, discovering that a given DOI is a member of a given AP is a shortcut to knowing what metadata elements can be found for the DOI, for knowing who is responsible for maintaining the DOI, and for any other characteristic that is common to the set of DOIs which are of that AP.



DOI data which is not common to all members of an AP is  associated with an individual DOI on a one-to-one basis. All Application Profiles beyond Zero contain a minimum of some publicly declared metadata (the kernel metadata) which is sufficient to provide users and applications with a basic description of the entity identified with a DOI.



The indecs metadata framework is the basis for normalizing across different metadata schemas used by different communities, enabling communities to build schemas which meet their needs.  Application Profiles bring together a number of things, all along the lines of classing DOIs for convenience in dealing with large numbers of them while still allowing for individual differences. That includes metadata, policies, and services.



Application Profiles are articulated by defining a data type within the DOI handle record. The resolution system is able to retrieve this data; clients (such as that implemented in the DOI Adobe plug-in) know how to parse that data; in the case of a defined AP the client finds first the reference to the application profile data type, and then keeps looking and finds some URI referenced by the AP definition. The job of the DOI (handle) client library is to go off and get the data, wherever it lives. Then it hands that data off to whatever asked it to do that (the client such as the DOI Adobe plug in) in the first place.



For more on this topic, see the DOI Handbook chapter Applications.






30. What is an Application Profile and what data does it associate with a DOI?


Every DOI is associated with one or more Application Profiles (APs).  APs, which will themselves be identified by DOIs, are abstractions used to group DOIs into sets in which all DOIs of the given set, or AP, share a metadata schema, business rules for DOI assignment, and other common characteristics.  An AP consists of at least a set of structured metadata elements, plus some rules (policy, business and procedural rules, not all necessarily automated).   AP metadata, business rules, and other specifics will be determined by the community defining the AP; in practice this is likely to be, or to closely involve, the RA concerned.



APs are an aid to using DOIs, enabling all DOIs assigned to e.g. journal articles to behave in a consistent and predictable fashion, that would necessarily differ from the characteristics and behaviour of DOIs assigned to e.g. recorded music.  For example, if one intended use of DOIs is to lead to metadata for the identified entity and the metadata for journal articles and recorded music, outside of a small common kernel, will be quite different.  This is only one example: in fact the data structures and potential services associated with DOIs by their assignors will not only depend upon the type of entity being identified but also by the intended usage of the DOI.   An Application Profile groups together characteristics not only of the type of identified entity (roughly what has been called the "genre") but also the intended usage, or application, of the DOI.



The core elements of an AP will be a metadata schema and various business and procedural rules.  The business and procedural rules will cover such policies as "who can assign a DOI within this AP" and "what elements of metadata are public in this AP" and so on. The metadata elements common to all members of an AP will be defined through the use of the DOI data dictionary, which is an implementation of the indecs data dictionary developed as part of the ISO MPEG-21 process. Entities within this data dictionary will be assigned a unique iid (indecs identifier). In the DOI implementation of the data dictionary, each iid will also be a DOI (DOI.iid). This standardization of elements will allow developers, using a planned registry of APs, to know which elements are shared by which APs. Beyond metadata and business rules, APs may also include standard services, e.g., any DOI of AP X may be sent as an http query to location Y in order to request rights information. The use of DOIs to identify APs brings the standard benefits of indirection, that is, location Y in the above example can change without affecting the millions of DOI records that might reference AP X.



The DOI/AP relationship can be in one of three states:




  • Zero AP: no AP is associated with this DOI. Most DOIs are currently in this state.




  • Base AP: the only data associated with this AP is the kernel metadata (the minimum set of 6 elements, plus the DOI value and the DOI AP name).




  • Full AP: the kernel metadata plus other metadata (which must be mapped to the DOI data dictionary) plus business rules and procedures plus any other common elements such as available services. We expect a number of different APs to evolve, roughly corresponding to communities of interest.




APs are intended, as are the other DOI mechanisms, to serve as infrastructure for the coherent management and use of intellectual property. While they will be defined and maintained by communities of interest, probably as represented by IDF Registration Agencies, they may also serve as convenient mechanisms for associating third party services with classes of DOIs. Registries will be established for this purpose. The specific rules and procedures for relating a given AP to third party services will be determined by the creators of that AP. To the extent that an AP is public, of course, anyone may operate a service applicable to that set of DOIs.



New APs must be approved by the IDF and centrally registered, to minimise duplication of effort and maximise interoperability. Defined APs will be made available to others who wish to construct new APs or re-use existing APs.


Registration Agencies add value at various levels by offering services to registrants. These services can include the definition of APs, and the one-off mappings needed in creating these from metadata sets already in use in the particular community concerned.  There are two mandatory requirements for an RA using the DOI metadata system:


  1. To declare the DOI kernel metadata in a standard format


  2. To map the full Application Profile to the DOI standard data dictionary




Once an AP is defined, RAs can offer services in allocating DOIs within this AP, ensuring the AP information is completed, populating the DOI system with allocated DOIs, maintaining up to date records, etc.   Consultancy on implementation, design of new applications, etc are other obvious areas for business development by RAs.  



For more on this topic, see the DOI Handbook chapter Applications.






31. What data is held in the resolution system and associated
with a DOI?



The core resolution system for all DOIs is the Handle System. Each DOI is registered as a handle in the Handle System and associated with a set of typed values. These values are returned in response to a resolution request for a given DOI. The values can be changed while the DOI remains constant, giving the DOI its basic qualities of being both actionable and persistent.



DOIs, with the exception of certain special cases, are registered with a minimum of one value, of the type "URL". This can generally be thought of as 'location' but it really functions as the default value of the DOI in the context of the web and may not actually be the location of the identified entity.  For anything beyond the simplest DOI, the declaration of an AP is an additional value within the Handle record, with its own data type. The DOI kernel metadata has as one element, "DOIApplicationProfile," which will reference this same data.



The association of an AP with a DOI may be sufficient, or may require additional data within the handle record. If services are associated with a given AP, for example, but the location of the service varies with DOI, then the declaration of the AP may need to be accompanied by the location of the service specific to that DOI. Similarly, two Registration Agencies (RAs) could share an AP but, in order to determine which RA had registered a given DOI, the AP declaration would have to be accompanied by an indication of RA. The precise mechanisms for accomplishing these tasks will be defined by the AP. At a certain level of variability across DOIs within an AP, of course, it may be better to create an additional AP rather than stretch one to cover too many different cases.  Functional requirements will determine which is the case.



Additional data, beyond APs and any DOI-specific AP data, can be associated with a DOI as it is found useful. While the association of services and DOIs can be done through the AP mechanism, it may be that some services are best associated with each individual DOI and not through an already related AP. If this additional data is related using the Handle System, new data types can be created, as the Handle System typing mechanism is extensible.  As with APs, data types must be approved and centrally registered, with the aim of minimising duplication and maximising interoperability.



Where data types require entities which are already defined within the DOI Data Dictionary, the DOI.iid  will be referenced.  Data types will also be identified by means of DOIs.  



The combination of data typing through the resolution system, and interoperable metadata accessed through an Application Profile, provides a powerful set of tools for the creation of DOI services.




For more on this topic, see the DOI Handbook chapter Applications.





32. DOI stresses interoperability, resolution and metadata -- how
do they relate to each other?



The Application Profile concept in DOI provides linkage between the resolution mechanism used in the DOI (handle) and the structured metadata approach (indecs).  DOI's  handle resolution allows identifier interoperability - i.e., you can encapsulate an ISBN or other identifier as a DOI and then resolve it to any current state data.   An Application Profile is the hook into metadata semantic interoperability -- i.e. you can use whatever metadata schema your community finds useful with your DOI, but mapping through the AP provides a way of talking (semantically interoperating) with other objects that are encoded in different schema).  The AP approach is built on indecs principles also adopted elsewhere such as ISO MPEG 21.  



DOIs resolve to one or more typed values in the Handle System and it is these typed values that determine client behavior. The predominant client at the moment is a proxy, or gateway, at dx.doi.org that takes normal http GETs, e.g., http://dx.doi.org/10.123/456 where the DOI is 10.123/456, resolves the DOI in the Handle System looking for URLs and returns those URLs to the originating web browser as http re-directs. This is how most DOIs currently implement a single level of indirection. Using a dedicated client, such as a plug-in for Acrobat, opens this up considerably, letting us use different data types for different purposes.  



For more on this topic, see the DOI Handbook chapter Applications.





33. What is a "DOI Service"?


A defined result from a defined action i.e., do X and the result will be Y.  DOI Services perform specific functions when presented with data from DOI Application Profiles.   DOI services exchange data, share tasks, and automate processes over the Internet by using the information associated with a DOI.   The term was coined in analogy to "Web services": for DOI applications on the Web, DOI services would be Web Services.   As a new class of Internet-native applications, web services promise to increase interoperability and lower the costs of software integration and data interchange: these aims are clearly identical to those of DOI (and its underlying tools of resolution -- Handle System -- and metadata -- indecs framework).   Based on unambiguous rules, DOI services make it possible for computer programs to communicate directly with one another and exchange data about intellectual property entities regardless of location, operating systems, or languages.  



The combination of data typing through the resolution system, and interoperable metadata accessed through an Application Profile, provides a powerful set of tools for the creation of DOI services.



For more on this topic, see the DOI Handbook chapter Applications.






34. What information about a DOI is publicly available?


Once a DOI is assigned, anyone may resolve that DOI without charge.   At least some information will always be available on resolution.  



The information available on resolution depends on the Application Profile (AP) of the DOI. DOIs can be associated with one of three categories of AP Public availability of information is as follows:
  


  • Zero AP: no data other than a URL is registered and therefore only that is available.


  • Base AP: the kernel metadata set (the minimum set of 6 elements, plus the DOI value and the DOI AP name) is registered with each DOI within this AP.  The values of each DOI's kernel metadata, the minimum required to permit basic recognition of the entity to which the DOI is assigned, must be publicly available, so that a basic description of the entity the DOI identifies can be accessed by any user and services built which can interpret DOIs.

  •   
  • Full APs: these contain the kernel metadata set, plus other metadata values (which must be mapped to the DOI data dictionary).  Whilst the AP scheme must be made available (so that users can determine which metadata fields are associated with the DOI), the actual values of any metadata for each DOI need not be; whether some or all of these are made available will be determined by the registrant or AP rules.




As the DOI system evolves, it is gradually moving from zero to full APs.  



Uses of the DOI which are restricted and not public (either permanently or temporarily) require special declarations and treatment.  Private use of the DOI may have advantages either in conferring on a private scheme the benefits of interoperability, persistence, well-formed data structures, and governance structure; and in allowing the subsequent migration of private identifiers into the public realm without having to reassign identifiers with a policy or technical change which allows them to be private (and potentially switched to public) if desired.



For more on this topic, see the DOI Handbook chapters Applications and Policy.




35. What are the benefits of the DOI for Publishers, Intermediaries, and users?


The DOI System offers a unique set of functionality:




  • Persistence, if material is moved, rearranged, or bookmarked;

  • Interoperability with other data from other sources;

  • Extensibility by adding new features and services through management of groups of DOIs;

  • Single management of data for multiple output formats (platform independence);

  • Class management of applications and services;

  • Dynamic updating of metadata, applications and services.




For users, these features provide the ability to:



  • Know what you have

  • Find what you want

  • Know where it exists

  • Be able to get it

  • Be able to use it in a transaction




For more on this topic, see the DOI Handbook chapter Introduction.


  

  
    36. How do I apply to become a Registration Agency?
    
      
Any organization that can represent a defined "community of interest" for alloca
Posted by 아름프로
What is the ISRC?

The ISRC (International Standard Recording Code) is the international identification system for sound recordings and music videorecordings. Each ISRC is a unique and permanent identifier for a specific recording which can be permanently encoded into a product as its digital fingerprint.  Encoded ISRC provide the means to automatically identify recordings for royalty payments.

The International Federation of the Phonographic Industry (IFPI) recommends that all music producers use ISRC.

Benefits of using ISRC

The ISRC system is the key to royalty collection for recordings in the digital information age.

  • ISRC is a unique, reliable, international identification system.
  • ISRC provides a unique tool for the purpose of rights  administration.
  • ISRC is a useful identification tool in the electronic distribution of music.
  • ISRC coding is compatible with standards developed in the field of consumer electronics and is readable by hardware already used in the recording industry.   
  • ISRC is cost effective - it can be put into operation without requiring special investment in equipment or technologies.





***** 아름다운프로님에 의해서 게시물 복사 + 카테고리변경되었습니다 (2003-12-18 17:01)
Posted by 아름프로

[Music] PII

2003. 8. 4. 01:36
...



***** 아름다운프로님에 의해서 게시물 복사 + 카테고리변경되었습니다 (2003-12-18 17:01)
Posted by 아름프로

What is the ISAN?


The ISAN (International Standard Audiovisual Number) is a voluntary numbering system for the identification of audiovisual works. It provides a unique, internationally recognized and permanent reference number for each audiovisual work registered in the ISAN system.
An ISAN consists of 16 hexadecimal digits divided into two segments: a 12-digit root segment followed by a 4-digit segment for the identification of episodes or parts when applicable.

A check digit is also appended to the ISAN whenever an ISAN is presented in human-readable form. The purpose of the check digit is to verify the accurate transcription of the preceding string of 16 digits in each ISAN.

The ISAN is not a "content descriptor". It is a "dumb" number, meaning that it does not include any codes or other signifying elements. Its purpose is to identify the work with a unique number, not to provide any type of descriptive information about the work.

The ISAN identifies works, not publications (unlike the ISBN for books) or broadcasts. The ISAN remains the same for an audiovisual work regardless of the various formats in which the work is distributed (e.g. DVD, videorecording) or the uses to which it is put.


What is the ISAN used for?


An ISAN uniquely distinguishes one audiovisual work from all other audiovisual works. Other methods of identifying audiovisual works, such as by title, can result in confusion about the specific work being referenced. For example, one title can be very similar to another. Titles also change when a work is distributed beyond its country (or countries) of origin and the title is translated into other languages.
Because each ISAN is a unique number that is permanently assigned to an audiovisual work, it can identify that work across national boundaries and language barriers.

As a unique identifier, the ISAN is useful in a wide range of computerized applications, particularly those which involve databases or the exchange of information about audiovisual works. Some of its possible applications are:

by collecting societies to assist in the allocation of royalties;
to track the use of audiovisual works; and,
for anti-piracy purposes such as verifying title registrations.


When and where can I get an ISAN?


The ISAN standard was approved and published in November 2002. The ISAN International Agency that will administer the system has been established in Geneva, Switzerland. Work is now underway on developing the software to manage the global ISAN system and on establishing a network of registration agencies to assign the ISAN to applicants. As soon as the first registration agencies are established later in 2003, the ISAN will be ready for implementation by interested parties within the audiovisual community.
In the meantime, please bookmark this page for updates on the establishment of the ISAN system.

  

What is an "audiovisual work"?


For the purposes of the ISAN, the term "audiovisual work" is not a legal concept but a practical one that covers any fixation of moving images.
The ISAN standard defines "audiovisual work" as follows:

audiovisual work: work consisting of a sequence of related images, with or without accompanying sound, which is intended to be made visible as a moving image through the use of devices, regardless of the medium of initial or subsequent fixation.
Examples of the types of audiovisual works to which ISAN may be assigned are:

motion pictures (e.g. feature films) and short films;
trailers (i.e. previews);
productions for television or other means of delivery, including individual episodes of television series;
industrial, educational and training films;
commercials;
broadcasts and recordings of live events (such as sports events and newscasts);
composite and multimedia works if they contain a significant audiovisual component.
ISAN will not be issued for any non-audiovisual elements associated with an audiovisual work. For example, an ISAN would be given to a feature film but not to its soundtrack, screenplay, or to any single images or still photographs from the film.

A related identifer (called V-ISAN at present) is being developed for versions of audiovisual works and related content.



How will versions of an audiovisual work be identified?


A supplementary identification scheme (the "V-ISAN") is being developed to identify versions of an audiovisual work and related content. The ISAN project is working in cooperation with the Society of Motion Picture and Television Engineers to develop this supplementary system, which will use the ISAN as its root element.




Where is the ISAN be attached?


The ISAN is the unique reference number for an audiovisual work and as should be included as a data element in any systems used to manage and process information about audiovisual works. Collecting societies, for example, will use the ISAN when they exchange and process information about the use of audiovisual works.
For audiovisual works in digital form (e.g. DVD), the ISAN should be embedded into the appropriate master copies of the work and transferred to any subsequent copies made from those masters. The MPEG 2 and MPEG 4 standards (for the coded representation of audiovisual and multimedia objects) provide a space for the ISAN identifier in the MPEG format.

For audiovisual works in analogue form (e.g. celluloid film), the ISAN should be securely affixed to the master and any other archival copies. For new works, that could involve printing the ISAN on the master negative. For works already in existence, that would involve securely linking the work and its ISAN in some form of permanent record, archive or inventory. It could also involve physically recording the ISAN on the container of the master version, whenever possible.

The ISAN should also be included in the documentation and packaging for an audiovisual work.

The AGICOA database is working on a project to retrospectively number the works recorded in its databases with ISAN, so that a critical mass of registered works will be in place for the official launch of the ISAN system.




How does the ISAN affect copyright registration?


It doesn't - because the ISAN is not related in any way to copyright, in either the European or North American sense of that term.
The ISAN is an identification number without any legal implication or meaning. It has no value as prima facie evidence regarding the copyright status or ownership of a work.

The scope of the ISAN standard clearly states:


"The issuance of an ISAN shall in no way be related to any process of copyright registration, nor shall the issuance of an ISAN provide evidence of the ownership of rights in a work."
Even though the ISAN may be a used by collecting societies as a tool to precisely distinguish each audiovisual work in their databases, the ISAN itself does not identify rights owners.





Is an ISAN required for audiovisual works?


No. The ISAN is a voluntary numbering system. There is no requirement to adopt or implement ISAN for audiovisual works. Members of the audiovisual community will implement ISAN by choice, not obligation.
The ISAN is an industry-driven numbering system. It is a tool to facilitate business, by the industry and for the industry. The efficiency and precision that the ISAN provides for identifying audiovisual works makes the ISAN a logical business decision -- but it isn't a mandatory one.



Who assigns the ISAN?


The ISAN system is administered by the ISAN International Agency (ISAN-IA) that coordinates the overall system and maintains a central record of all ISAN registrations. The ISAN International Agency appoints, and oversees the work of, individual ISAN registration agencies that are established to serve specific countries, regions or market sectors. These registration agencies receive and process applications for ISAN and assign the actual numbers to specific works.
All of the ISAN agencies operate as non-profit organizations. The registration agencies have not yet been established but the first ISAN agencies should be place later in 2003.



Who can apply for an ISAN?


The entity or person to whom an ISAN is given should have the capacity to permanently attach or link that ISAN to the specific audiovisual work that it identifies.
All potential applicants for ISAN must apply first to an ISAN registration agency in order to be recognized as a registrant within the ISAN system. The purpose of this pre-registation process is to minimize the opportunity for "pirates" to obtain legitimate ISAN for stolen intellectual property and fraudulent purposes. This pre-registration process only applies to first-time ISAN applicants; it is not repeated for any subsequent ISAN applications from the same registrant.

New applicants for registrant status will be asked to submit some form of proof of their involvement in the audiovisual industry (e.g. membership in or sponsorship by a recognized trade association, declaration of activity in the audiovisual industry, funding by a public agency, etc.).

An appeal process will also be available for any applicants rejected by an ISAN registration agency.



What does an ISAN cost?


In order to provide some independent means of support for the ISAN agencies, a small fee may be charged for each ISAN registration. Any such registration fees would be established on the basis of cost-recovery.
Additional fees may be charged for other services provided by the ISAN agencies, such as customized products from its database of identification information.



Who developed the ISAN?


The ISAN was developed as an International Standard under the auspices of "ISO/TC 46/SC 9":
ISO is the International Organization for Standardization, based in Geneva.

TC 46 is ISO's Technical Committee (TC) for information and documentation standards.

SC 9 is the TC 46 Subcommittee (SC) that develops and maintains ISO standards on the identification and description of information objects.
In May 1997, ISO/TC 46 Subcommittee 9 established a Working Group (WG 1) to develop the ISAN project. The project was under the joint administration of:


AGICOA: Association de Gestion Internationale Collective des Oeuvres Audiovisuelles (International Association for the Collective Management of Audiovisual Works);

FIAPF: F??ation Internationale des Associations de Producteurs de Films (International Federation of Film Producers' Associations)

CISAC: Confédération Internationale des Sociétés d'Auteurs et de Compositeurs (International Confederation of Authors' and Composers' Societies)

Participants from several countries and international associations were members of the ISAN Working Group and active contributors to the development of the ISAN project.





For further information
For further information about the ISAN system, please contact:


Mr. Pierre-Henri Guisan
Managing Director
ISAN International Agency
26, rue de Saint Jean
CH-1203 Geneva
Switzerland
E-mail: pierre-henri.guisan@isan.org
Fax: 41 22 340 34 32




***** 아름다운프로님에 의해서 게시물 복사 + 카테고리변경되었습니다 (2003-12-18 17:01)
Posted by 아름프로
What is an ISWC?

The ISWC (International Standard Musical Work Code) is a unique, permanent and internationally
recognized reference number for the identification of musical works.


Where did the ISWC originate?

The ISWC is part of the CIS plan (Common Information System) which CISAC, the confederation of societies
of authors, has developed in order to respond to the needs for information in the digital age.

Is ISWC a world-wide standard?

Yes. The ISWC has been approved by ISO (International Organization for Standardisation). There is an
official document that defines how the ISWC should be structured, as well as the rules governing its issuance
and application.


What is an ISWC composed of?

An ISWC begins with the letter "T", followed by a nine-digit unique number (from 00000001 to 999999999),
and an additional check digit at the end. (Written Format: T-345246800-1).


When is an ISWC allocated?

An ISWC is only allocated by a qualified numbering agency when all the creators have been uniquely identified.


What is the descriptive metadata for an ISWC?

The descriptive metadata for an ISWC includes: ?the title of the work?all composers, authors and arrangers
of the work identified by their CAE/IPI numbers and role codes? the work classification code
(from the CIS standards list)?in the case of 'versions', for example arrangements, identification of the
work from which the version was made. Without this minimum information, an ISWC cannot be allocated.


What will the ISWC do?
The ISWC will uniquely and accurately identify each specific musical work. The current identification methods
of Musical works, such as by work title, may at times result in confusion specially when multiple musical works
share the same or similar titles. Since ISWC remains permanently with a musical work, it will identify that musical
work even after the work is distributed across national boundaries and languages barriers. The ISWC will support
a wide range of computerized applications, particularly those involving tracking and exchange of musical works
information. (e.g. Registration, Identification, Royalty Distribution, etc.).


What will an ISWC not do?
The ISWC identifies musical works, not their manifestations, objects, or expressions. (e.g. publications, broadcasts,
etc.) The ISWC will not identify recordings, sheet music or any other type of performance associated with the
musical work. Furthermore, the ISWC will not indicate the shares of composers or copyright owners of the work (there are often too many of them and they change with time and according to the territory and rights), nor the date or the
place where the work was initially published.

How should the ISWC be used?

The ISWC should be integrated within the musical works administration databases and processes that support
such activities as: ?registration and correspondence between society of authors ?publishing and sub-publishing
agreement schedules?licences granted by a society?music usage reporting?performance collection and identification
royalty administration. When a musical work in correspondence or in contracts is identified, the ISWC should be
indicated as in the following example:1.1 "I Love Life" (Smith/Jones) (ISWC T-345246800-1)

Who is responsible for allocating ISWC's?
The International ISWC Agency, which is appointed by ISO, is responsible for the overall ISWC system maintenance and administration. The International ISWC Agency will appoint and oversee the work of Regional and/or Local ISWC numbering agencies. These agencies will be authorized to receive and process applications for ISWC and allocate the actual ISWC numbers to the musical works.

What does a local ISWC agency do?
A local ISWC agency allocates the ISWC numbers to the works under its authority. It will administer a database for the allocated ISWC numbers and their corresponding descrpitive metadata. It will also share the available ISWC information with other local ISWC agencies and societies of authors.


Top of
the page

What determines the authority of a local ISWC agency to assign ISWC numbers?
The author's CAE/IPI number is the key that determines whether an agency is authorised to allocate an ISWC. The international CAE/IPI file indicates the author's society of membership. If that author's society of membership is within the juristiction of the local ISWC agency, then the agency is authorized to allocate the ISWC number. This ensures that the same musical work is not assigned multiple ISWC numbers by different local ISWC agencies.


May creators and publishers allocate their own ISWC numbers?
No. ISWCs must be allocated by an authorized national or regional ISWC agency. If the creators or publishers do not have a relationship with a national or regional ISWC agency, they may directly apply for an ISWC number through the International ISWC Agency.

What happens when creators change society?
The authority which allocates an ISWC for their musical works is also transferred to the new society.

Who allocates ISWCs to works co-written by creators of dfferent societies ?
The agency who can allocate the ISWC must verify with the other agency's that a number has not already been allocated for the musical work. Once an ISWC is allocated, the agency should immediately inform all other interested parties, as well as other agencies

What particular steps should be taken to obtain an ISWC?
None for new works. Works will be automatically allocated a number as part of the registration process by the society of authors in question. As for works already registered, "existing" repertoire, the ISWC numbers may be allocated at any time.

Which types of musicl works can receive an ISWC?
An ISWC may be assigned to any musical work, published or unpublished, newly created or already existing as:
Dramatico-musical work-Musical arrangement of a work
Adaptation of the lyrics of a work-Translation of the lyrics of a work
Recognised excerpt of a work-Medley-Potpourri etc...


Should , adaptations and translations get an ISWC ?
Musical arrangements, adaptations of lyrics and translations must receive their own unique ISWC numbers. These ISWC numbers are usually allocated by the agency which administrates the works of the arranger and/or adapter. The connection between the 'version' and the original work is indicated in the descriptive metadata of the ISWC.

May excerpts from other works be numbered too?
All works should be identified in their own rights; for example, an aria from an opera or a cadenza from a concerto can receive an ISWC. Similar to the 'versions', the relationship between excerpts should be indicated in the descriptive metadata of the ISWC.

May works or 'versions' which breach copyright obtain an ISWC?
Surprisingly enough, the answer is "yes". The non-authorised arrangements of a musical work can be identified, if only to ensure that they will be recognised at an international level as works infringing the copyrights of others.

Does the work have to be protected by copyright before receiving an ISWC?
No. ISWC's are allocated regardless of copyright status. Agencies may 'adopt' authors from the "public domain", according to their local laws, and allocate ISWC numbers to their works. This is generally done for reasons of national interest. For example, the 'traditional' folk repertoire, works in the public domain whose authors are unknown, can be numbered by an authorized national agency.

Will the ISWC replace the society's own numbering system?
Almost certainly not. Most organisations will still require their own internal identification numbers for internal reasons. On the other hand, the ISWC is the 'lingua franca' which will allow databases to be linked automatically.

What is the ISWC Agency Manual?
It is a detailed technical document that explains the present rules and procedures governing the administration and use of ISWC's.

Is there a list of ISWC agencies?
Yes, a regularly revised list of authorized ISWC agencies, including their contact information, may be obtained from the this web site by clicking on




***** 아름다운프로님에 의해서 게시물 복사 + 카테고리변경되었습니다 (2003-12-18 17:01)
Posted by 아름프로

What Is an ISMN? 


  The International Standard Music Number (ISMN) is a unique number for the identification of all printed music publications from all over the world, whether available for sale, hire or gratis--whether a part, a score, or an element in a multi-media kit.

The ISMN is designed to rationalize the processing and handling of printed music and the respective bibliographical data for publishing houses, the music trade and libraries.

The ISMN consists of four elements comprising ten digits,

for example, M-2306-7118-7



M         the prefix M which distinguishes the ISMN from other standard numbers;
2306   a publisher ID which identifies a certain music publisher;
7118   an item ID which identifies a certain music print; and
7          a check digit which validates the number mathematically.



ISO Standard 10957 gives the basic rules of the ISMN system.

The ten-digit number allows a billion items each to carry a different number.

The ISMN can be converted into a bookland code and printed with a scanner raster:








***** 아름다운프로님에 의해서 게시물 복사 + 카테고리변경되었습니다 (2003-12-18 17:01)
Posted by 아름프로
Broadchart :
http://www.broadchart.com (catalogued using the ID3v2)

MusicBrainz
http://musicbrainz.org/  
Music Metadata (ID3 and Vorbis/FLAC Comment) Tags
http://www.musicbrainz.org/docs/specs/metadata_tags.html






***** 아름다운프로님에 의해서 게시물 복사 + 카테고리변경되었습니다 (2003-12-18 16:57)
Posted by 아름프로
id3 :
http://www.id3.org

id3 tag :
http://search.yahoo.com/search?p=id3+tag&rs=0&ei=UTF-8&fr=fp-top

id3 editor :
http://search.yahoo.com/search?p=id3+editor&rs=1&ei=UTF-8&fr=fp-top





***** 아름다운프로님에 의해서 게시물 복사 + 카테고리변경되었습니다 (2003-12-18 16:57)
Posted by 아름프로
Refactoring Workbook - Source Code



***** 아름다운프로님에 의해서 게시물 복사 + 카테고리변경되었습니다 (2003-12-18 17:27)
Posted by 아름프로
Refactoring Workbook



***** 아름다운프로님에 의해서 게시물 복사 + 카테고리변경되었습니다 (2003-12-18 17:27)
Posted by 아름프로
Refactoring
What is Refactoring? It is improving the design of your code without adding new behavior. Why would you want to do that? To boost your productivity. How does it help do that? By helping you produce smaller, simpler, better communicating code. To learn more, read Martin Fowler's classic: Refactoring: Improving the Design of Existing Code.


Refactoring To Patterns
Download the latest draft (Adobe Acrobat, under 750k)
Last updated: February 11, 2003
Refactoring to Patterns is a growing body of work that includes neary 2 dozen refactorings. As I continue to improve and extend the book, I welcome your feedback and suggestions. I'll be presenting tutorials on this subject at upcoming conferences as well as in The Design Patterns Workshop. -- Joshua Kerievsky




***** 아름다운프로님에 의해서 게시물 복사 + 카테고리변경되었습니다 (2003-12-18 17:27)
Posted by 아름프로


Errata for Refactoring



Here are the current known errors in the Refactoring book.



Many thanks to Mike Anderson, Alex Aptekman, Beth Egan Bradtke, Greg Cohoon, George Cowan, John Dale, Dion Dock, Jutta Eckstein, Paul Haahr, John Hollister, Heinz Kabutz, Bernd Kahlbrandt, Bart Koestner, Jung-joon Kim, Mark Kinzie, Hamish Lawson, Hwijae Lee, Jaeik Lee, Marc Lepage, Ron Lusk, Rory Molinari, Anthon van der Neut, Orjan Petersson, Jon Reid, Oliver Rode, Phil Rodgers, Gavin Scott, Patricia Shanahan, Pradyumn Sharma, Joel Smith, Ellen Spertus, Dawie Strauss, Frank Tip, Madhavi Tolety, Bill Wake and Hirohide Yazaki  for spotting and telling me about these errors




Errors in the eighth (and later) printing

Page 2:
        In the first paragraph "and identifies the type movie" should read "and identifies the type of movie".

Page 12:
        

I've been asked for more information about the double to int rounding. It happens when you have a compound assignment. In other words
        


        
        int foo=1;
        foo += 1.5;
        

        

compiles, as it is equivalent to


        
        int foo = 1;
        foo = (int) (foo + 1.5);
        

        

I haven't looked into the rationale behind this. (see Java Language Specification, section 15.26.2)
        


Page 40:
In the code examples on pages 40 and 41 the references to the field _name should instead be _title

Page 98:
        The method testReadAtEnd is incorrect. I looked at my source files and found the method there to say


        public void testReadAtEnd() throws IOException {
                int ch = -1234;
                for        (int i = 0; i < 141; i++)
                        ch = _input.read();
                assertEquals("read at end", -1, _input.read());
        }
        

        Another reason to be glad that these days I'm auto-inserting source code!

Page 115:
In the third line, "rerun" should be "return"

Page 120:
        In the solution statement the phrase "Replace all references to the temp with the expression" should be replaced with "Replace all references to the temp with the new method"

Page 121:
        This was an incorrect fix to an earlier error. In the last line of the mechanics the refactoring 'Replace Temp with Inline Temp' should read 'Inline Temp'. The same problem occurs on page 122.

Page 153:
        In the second para, third line "As discussed in Lea by section..." should read "As discussed in Lea in section...."

Page 176:
        In the second para, (a step in the mechanics) "change the getting method" should read "change the setting method"

Page 185:
        In the second paragraph "biwise xor" shoudl read "bitwise xor"

Page 222:
        At the bottom of the page I make the method getCode private. I obviously can't do that while any clients of BloodGroup are using the method.

Page 225:
        The first mention of the create method is missing the static keyword.

Page 240:
        On this page and on later pages I use the method isNotEligibleForDisability. Since my spell checker doesn't look at code it didn't tell me that the correct spelling is Eligable.

Page 301:
        There are problems with the example, see the discussion in RemoveSettingMethod.

Page 363:
        The references to the refactorings on this page are cross referenced with chapter references rather than the usual page references. Worse still, the chapter for Extract Class should be Chapter 7.


Errors in the fifth through eighth printing

Page 2:
        In the first paragraph "and identifies the type movie" should read "and identifies the type of movie".

Page 12:
        

I've been asked for more information about the double to int rounding. It happens when you have a compound assignment. In other words
        


        
        int foo=1;
        foo += 1.5;
        

        

compiles, as it is equivalent to


        
        int foo = 1;
        foo = (int) (foo + 1.5);
        

        

I haven't looked into the rationale behind this. (see Java Language Specification, section 15.26.2)
        


Page 25 :
        
        Caption on fig 1.7 "Sequence diagram before extraction..." should be "Sequence diagram after extraction..."
[Corrected in the 8th Printing]

Page 40:
In the code examples on pages 40 and 41 the references to the field _name should instead be _title

Page 76 :
        
        3rd para in "Duplicated Code". "in both classes then Pull Up Field (320)" should read "in both classes then Pull Up Method (322)"
[Corrected in the 8th Printing]

Page 98:
        The method testReadAtEnd is incorrect. I looked at my source files and found the method there to say


        public void testReadAtEnd() throws IOException {
                int ch = -1234;
                for        (int i = 0; i < 141; i++)
                        ch = _input.read();
                assertEquals("read at end", -1, _input.read());
        }
        

        Another reason to be glad that these days I'm auto-inserting source code!

Page 115:
In the third line, "rerun" should be "return"

Page 120:
        In the solution statement the phrase "Replace all references to the temp with the expression" should be replaced with "Replace all references to the temp with the new method"

Page 121 :
        
        In the last step of the mechanics, I say to use Replace Temp with Query (120), this should be replaced with a reference to Inline Temp (119). Otherwise I'd get a recursive refactoring. The problem continues in the example on page 122 where again the cross reference should be to Inline Temp (119). This was fixed incorrectly in the 8th printing (see below)
[Corrected in the 8th Printing]

Page 121:
        This was an incorrect fix to an earlier error. In the last line of the mechanics the refactoring 'Replace Temp with Inline Temp' should read 'Inline Temp'. The same problem occurs on page 122.

Page 153:
        In the second para, third line "As discussed in Lea by section..." should read "As discussed in Lea in section...."

Page 176:
        In the second para, (a step in the mechanics) "change the getting method" should read "change the setting method"

Page 176 :
        
        In the method numberOfOrdersFor the line that reads if (each.getCustomerName().equals(customer)) result++; should read if (each.getCustomer().equals(customer)) result++;
[Corrected in the 8th Printing]

Page 177 :
        
        In the first state of the method setCustomer the line that reads _customer = new Customer (customer); should read _customer = new Customer (arg);
[Corrected in the 8th Printing]

Page 185:
        In the second paragraph "biwise xor" shoudl read "bitwise xor"

Page 219 :
        
        "In a paragraph at around the middle of page, the sentence "...need a new method that returns the code" should read "...need a new method that returns an instance of the new class."
[Corrected in the 8th Printing]

Page 222 :
        
        "In the crossed out code, the method "public int getBloodGroup() {" should be "public int getBloodGroupCode() {" (I had just renamed it!)"
[Corrected in the 8th Printing]

Page 222:
        At the bottom of the page I make the method getCode private. I obviously can't do that while any clients of BloodGroup are using the method.

Page 225:
        The first mention of the create method is missing the static keyword.

Page 240:
        On this page and on later pages I use the method isNotEligibleForDisability. Since my spell checker doesn't look at code it didn't tell me that the correct spelling is Eligable.

Page 285 :
        
        The before code contains a rather more serious error than the refactoring is meant to help with as the assertion is always executed.
        The before code should read:
        


        void setValue (String name, int value) {
                if (name.equals("height")) {
                        _height = value;
                        return;
                }
                if (name.equals("width")) {
                        _width = value;
                        return;
                }
                Assert.shouldNeverReachHere();
        }
        

[Corrected in the 8th Printing]

Page 301:
        There are problems with the example, see the discussion in RemoveSettingMethod.

Page 313 :
        
        

The line of code that says

    
        
        Assert.isTrue("amount too large", amount > _balance);
        

        

is in error as the sense of the boolean is the wrong way round. A better line would be
        


        
        Assert.isTrue("sufficient funds", amount <= _balance);
        

[Corrected in the 8th Printing]

Page 324 :
        
        In the top code example the line double chargeAmount = charge (lastBillDate, date) should read double chargeAmount = chargeFor (lastBillDate, date). (I got the method name inconsistent with the diagrams.)
        
[Corrected in the 8th Printing]

Page 328 :
        
        In the motivation paragraph "Pull Down Method" should read "Push Down Method". (This is what happens when I don't use links for everything!)
        
[Corrected in the 8th Printing]

Page 363:
        The references to the refactorings on this page are cross referenced with chapter references rather than the usual page references. Worse still, the chapter for Extract Class should be Chapter 7.


Errors in the fourth printing

Page xx :
        
"Joshua suggested the idea of code sketches" should read "Joshua Kerievsky suggested the idea of code sketches"
[Corrected in the 5th Printing]

Page 2:
        In the first paragraph "and identifies the type movie" should read "and identifies the type of movie".

Page 12:
        

I've been asked for more information about the double to int rounding. It happens when you have a compound assignment. In other words
        


        
        int foo=1;
        foo += 1.5;
        

        

compiles, as it is equivalent to


        
        int foo = 1;
        foo = (int) (foo + 1.5);
        

        

I haven't looked into the rationale behind this. (see Java Language Specification, section 15.26.2)
        


Page 25 :
        
        Caption on fig 1.7 "Sequence diagram before extraction..." should be "Sequence diagram after extraction..."
[Corrected in the 8th Printing]

Page 40:
In the code examples on pages 40 and 41 the references to the field _name should instead be _title

Page 76 :
        
        3rd para in "Duplicated Code". "in both classes then Pull Up Field (320)" should read "in both classes then Pull Up Method (322)"
[Corrected in the 8th Printing]

Page 98:
        The method testReadAtEnd is incorrect. I looked at my source files and found the method there to say


        public void testReadAtEnd() throws IOException {
                int ch = -1234;
                for        (int i = 0; i < 141; i++)
                        ch = _input.read();
                assertEquals("read at end", -1, _input.read());
        }
        

        Another reason to be glad that these days I'm auto-inserting source code!

Page 115:
In the third line, "rerun" should be "return"

Page 120:
        In the solution statement the phrase "Replace all references to the temp with the expression" should be replaced with "Replace all references to the temp with the new method"

Page 121 :
        
        In the last step of the mechanics, I say to use Replace Temp with Query (120), this should be replaced with a reference to Inline Temp (119). Otherwise I'd get a recursive refactoring. The problem continues in the example on page 122 where again the cross reference should be to Inline Temp (119). This was fixed incorrectly in the 8th printing (see below)
[Corrected in the 8th Printing]

Page 121:
        This was an incorrect fix to an earlier error. In the last line of the mechanics the refactoring 'Replace Temp with Inline Temp' should read 'Inline Temp'. The same problem occurs on page 122.

Page 153:
        In the second para, third line "As discussed in Lea by section..." should read "As discussed in Lea in section...."

Page 176:
        In the second para, (a step in the mechanics) "change the getting method" should read "change the setting method"

Page 176 :
        
        In the method numberOfOrdersFor the line that reads if (each.getCustomerName().equals(customer)) result++; should read if (each.getCustomer().equals(customer)) result++;
[Corrected in the 8th Printing]

Page 177 :
        
        In the first state of the method setCustomer the line that reads _customer = new Customer (customer); should read _customer = new Customer (arg);
[Corrected in the 8th Printing]

Page 185:
        In the second paragraph "biwise xor" shoudl read "bitwise xor"

Page 193 :
        
"to declare that interval window implements Observable" should read  "to declare that interval window implements Observer" [Corrected in the 5th Printing]

Page 219 :
        
        "In a paragraph at around the middle of page, the sentence "...need a new method that returns the code" should read "...need a new method that returns an instance of the new class."
[Corrected in the 8th Printing]

Page 222 :
        
        "In the crossed out code, the method "public int getBloodGroup() {" should be "public int getBloodGroupCode() {" (I had just renamed it!)"
[Corrected in the 8th Printing]

Page 222:
        At the bottom of the page I make the method getCode private. I obviously can't do that while any clients of BloodGroup are using the method.

Page 225:
        The first mention of the create method is missing the static keyword.

Page 240:
        On this page and on later pages I use the method isNotEligibleForDisability. Since my spell checker doesn't look at code it didn't tell me that the correct spelling is Eligable.

Page 261 :
        
In Ron's story, 4th para, "Of course, as soon as you being inspecting..." but should be "Of course, as soon as you begin
inspecting..."
  [Corrected in the 5th Printing]

Page 285 :
        
        The before code contains a rather more serious error than the refactoring is meant to help with as the assertion is always executed.
        The before code should read:
        


        void setValue (String name, int value) {
                if (name.equals("height")) {
                        _height = value;
                        return;
                }
                if (name.equals("width")) {
                        _width = value;
                        return;
                }
                Assert.shouldNeverReachHere();
        }
        

[Corrected in the 8th Printing]

Page 300 :
        
        In the mechanics section the field should be made final at the end
        of process not at the begining.
[Corrected in the 5th Printing]

Page 301:
        There are problems with the example, see the discussion in RemoveSettingMethod.

Page 307 :
        
"Another reason to be wary of class.forName is that..."
should be:
"Another reason to be wary of Class.forName is that..." (Class should have a capital C)
[Corrected in the 5th Printing]

Page 307 :
        
"I can use a differenct approach...."
should be:
"I can use a different approach..." (spelling) [Corrected in the 5th Printing]

Page 311 :
        
"If the exception us checked, adjust the callers..."
should be:
"If the exception is checked, adjust the callers..."
[Corrected in the 5th Printing]

Page 313 :
        
        

The line of code that says

    
        
        Assert.isTrue("amount too large", amount > _balance);
        

        

is in error as the sense of the boolean is the wrong way round. A better line would be
        


        
        Assert.isTrue("sufficient funds", amount <= _balance);
        

[Corrected in the 8th Printing]

Page 324 :
        
        In the top code example the line double chargeAmount = charge (lastBillDate, date) should read double chargeAmount = chargeFor (lastBillDate, date). (I got the method name inconsistent with the diagrams.)
        
[Corrected in the 8th Printing]

Page 328 :
        
        In the motivation paragraph "Pull Down Method" should read "Push Down Method". (This is what happens when I don't use links for everything!)
        
[Corrected in the 8th Printing]

Page 333 :
        
"arguments are needed by the labor item, and some are not"
should be: "some arguments are needed..." (missing word) [Corrected in the 5th Printing]

Page 346 :
        
"Whenever we see two similar method" should be: "Whenever we
see two similar methods" (plural) [Corrected in the 5th Printing]

Page 346 :
        
"The statement method prints statements" should be: "The
statement method prints statements" (font) [Corrected in the 5th Printing]

Page 363:
        The references to the refactorings on this page are cross referenced with chapter references rather than the usual page references. Worse still, the chapter for Extract Class should be Chapter 7.


Errors in the third printing

Page xx :
        
"Joshua suggested the idea of code sketches" should read "Joshua Kerievsky suggested the idea of code sketches"
[Corrected in the 5th Printing]

Page 2:
        In the first paragraph "and identifies the type movie" should read "and identifies the type of movie".

Page 12:
        

I've been asked for more information about the double to int rounding. It happens when you have a compound assignment. In other words
        


        
        int foo=1;
        foo += 1.5;
        

        

compiles, as it is equivalent to


        
        int foo = 1;
        foo = (int) (foo + 1.5);
        

        

I haven't looked into the rationale behind this. (see Java Language Specification, section 15.26.2)
        


Page 25 :
        
        Caption on fig 1.7 "Sequence diagram before extraction..." should be "Sequence diagram after extraction..."
[Corrected in the 8th Printing]

Page 40:
In the code examples on pages 40 and 41 the references to the field _name should instead be _title

Page 76 :
        
        3rd para in "Duplicated Code". "in both classes then Pull Up Field (320)" should read "in both classes then Pull Up Method (322)"
[Corrected in the 8th Printing]

Page 98:
        The method testReadAtEnd is incorrect. I looked at my source files and found the method there to say


        public void testReadAtEnd() throws IOException {
                int ch = -1234;
                for        (int i = 0; i < 141; i++)
                        ch = _input.read();
                assertEquals("read at end", -1, _input.read());
        }
        

        Another reason to be glad that these days I'm auto-inserting source code!

Page 115:
In the third line, "rerun" should be "return"

Page 120:
        In the solution statement the phrase "Replace all references to the temp with the expression" should be replaced with "Replace all references to the temp with the new method"

Page 121 :
        
        In the last step of the mechanics, I say to use Replace Temp with Query (120), this should be replaced with a reference to Inline Temp (119). Otherwise I'd get a recursive refactoring. The problem continues in the example on page 122 where again the cross reference should be to Inline Temp (119). This was fixed incorrectly in the 8th printing (see below)
[Corrected in the 8th Printing]

Page 121:
        This was an incorrect fix to an earlier error. In the last line of the mechanics the refactoring 'Replace Temp with Inline Temp' should read 'Inline Temp'. The same problem occurs on page 122.

Page 153:
        In the second para, third line "As discussed in Lea by section..." should read "As discussed in Lea in section...."

Page 176:
        In the second para, (a step in the mechanics) "change the getting method" should read "change the setting method"

Page 176 :
        
        In the method numberOfOrdersFor the line that reads if (each.getCustomerName().equals(customer)) result++; should read if (each.getCustomer().equals(customer)) result++;
[Corrected in the 8th Printing]

Page 177 :
        
        In the first state of the method setCustomer the line that reads _customer = new Customer (customer); should read _customer = new Customer (arg);
[Corrected in the 8th Printing]

Page 185:
        In the second paragraph "biwise xor" shoudl read "bitwise xor"

Page 193 :
        
"to declare that interval window implements Observable" should read  "to declare that interval window implements Observer" [Corrected in the 5th Printing]

Page 219 :
        
        "In a paragraph at around the middle of page, the sentence "...need a new method that returns the code" should read "...need a new method that returns an instance of the new class."
[Corrected in the 8th Printing]

Page 222 :
        
        "In the crossed out code, the method "public int getBloodGroup() {" should be "public int getBloodGroupCode() {" (I had just renamed it!)"
[Corrected in the 8th Printing]

Page 222:
        At the bottom of the page I make the method getCode private. I obviously can't do that while any clients of BloodGroup are using the method.

Page 225:
        The first mention of the create method is missing the static keyword.

Page 240:
        On this page and on later pages I use the method isNotEligibleForDisability. Since my spell checker doesn't look at code it didn't tell me that the correct spelling is Eligable.

Page 241 :
        
In the code examples at the bottom of the page, the method isEligibleForDisability
should be isNotEligibleForDisability [Corrected in the 4th Printing]

Page 261 :
        
In Ron's story, 4th para, "Of course, as soon as you being inspecting..." but should be "Of course, as soon as you begin
inspecting..."
  [Corrected in the 5th Printing]

Page 285 :
        
        The before code contains a rather more serious error than the refactoring is meant to help with as the assertion is always executed.
        The before code should read:
        


        void setValue (String name, int value) {
                if (name.equals("height")) {
                        _height = value;
                        return;
                }
                if (name.equals("width")) {
                        _width = value;
                        return;
                }
                Assert.shouldNeverReachHere();
        }
        

[Corrected in the 8th Printing]

Page 300 :
        
        In the mechanics section the field should be made final at the end
        of process not at the begining.
[Corrected in the 5th Printing]

Page 301:
        There are problems with the example, see the discussion in RemoveSettingMethod.

Page 307 :
        
"Another reason to be wary of class.forName is that..."
should be:
"Another reason to be wary of Class.forName is that..." (Class should have a capital C)
[Corrected in the 5th Printing]

Page 307 :
        
"I can use a differenct approach...."
should be:
"I can use a different approach..." (spelling) [Corrected in the 5th Printing]

Page 311 :
        
"If the exception us checked, adjust the callers..."
should be:
"If the exception is checked, adjust the callers..."
[Corrected in the 5th Printing]

Page 313 :
        
        

The line of code that says

    
        
        Assert.isTrue("amount too large", amount > _balance);
        

        

is in error as the sense of the boolean is the wrong way round. A better line would be
        


        
        Assert.isTrue("sufficient funds", amount <= _balance);
        

[Corrected in the 8th Printing]

Page 315 :
        
        The problem statement should read "You are throwing an exception
        on a condition the caller could have checked first" (the refactoring applies to all exceptions, not just checked ones)
[Corrected in the 4th Printing]

Page 324 :
        
        In the top code example the line double chargeAmount = charge (lastBillDate, date) should read double chargeAmount = chargeFor (lastBillDate, date). (I got the method name inconsistent with the diagrams.)
        
[Corrected in the 8th Printing]

Page 328 :
        
        In the motivation paragraph "Pull Down Method" should read "Push Down Method". (This is what happens when I don't use links for everything!)
        
[Corrected in the 8th Printing]

Page 333 :
        
"arguments are needed by the labor item, and some are not"
should be: "some arguments are needed..." (missing word) [Corrected in the 5th Printing]

Page 346 :
        
"Whenever we see two similar method" should be: "Whenever we
see two similar methods" (plural) [Corrected in the 5th Printing]

Page 346 :
        
"The statement method prints statements" should be: "The
statement method prints statements" (font) [Corrected in the 5th Printing]

Page 363:
        The references to the refactorings on this page are cross referenced with chapter references rather than the usual page references. Worse still, the chapter for Extract Class should be Chapter 7.


Errors in the first and second printings

Page xx :
        
"Joshua suggested the idea of code sketches" should read "Joshua Kerievsky suggested the idea of code sketches"
[Corrected in the 5th Printing]

Page 2:
        In the first paragraph "and identifies the type movie" should read "and identifies the type of movie".

Page 12:
        

I've been asked for more information about the double to int rounding. It happens when you have a compound assignment. In other words
        


        
        int foo=1;
        foo += 1.5;
        

        

compiles, as it is equivalent to


        
        int foo = 1;
        foo = (int) (foo + 1.5);
        

        

I haven't looked into the rationale behind this. (see Java Language Specification, section 15.26.2)
        


Page 25 :
        
        Caption on fig 1.7 "Sequence diagram before extraction..." should be "Sequence diagram after extraction..."
[Corrected in the 8th Printing]

Page 37 :
        
"Class rental" should be "class Rental" (capitalization) and "class
movie" should be "class Movie" (capitalization)
[Corrected in the 3rd Printing]

Page 40:
In the code examples on pages 40 and 41 the references to the field _name should instead be _title

Page 48 :
        
The second line: "class Rental..." should be: "class Movie..." [Corrected in the 3rd Printing]

Page 70 :
        
Steve McConnell's last name is misspelled in two places. [Corrected in the 3rd Printing]

Page 76 :
        
        3rd para in "Duplicated Code". "in both classes then Pull Up Field (320)" should read "in both classes then Pull Up Method (322)"
[Corrected in the 8th Printing]

Page 82 :
        
        The sentence "If you add a new clause to the switch, you have to find all these switch, statements and change them." The second comma should be removed.
[Corrected in the 3rd Printing]

Page 85 :
        
"Replace Delegation with Inheritance (355)" in Inappropriate Intimacy should be "Replace Inheritance with Delegation (352)"  [Corrected in the 3rd Printing]

Page 92 :
        
        On Figure 4.1 the line from TestSuite to Test should be an association
        not a generalization (see diagram below). Also the
        package name should be junit.framework.
[Corrected in the 3rd Printing]

Page 92 :
        
        In the test file for the example, George Headley's career total was actually 2190 test riuns.
[Corrected in the 3rd Printing]

Page 98:
        The method testReadAtEnd is incorrect. I looked at my source files and found the method there to say


        public void testReadAtEnd() throws IOException {
                int ch = -1234;
                for        (int i = 0; i < 141; i++)
                        ch = _input.read();
                assertEquals("read at end", -1, _input.read());
        }
        

        Another reason to be glad that these days I'm auto-inserting source code!

Page 115 :
        
In the second sentence, "oustanding" should be "outstanding"
[Corrected in the 3rd Printing]

Page 115:
In the third line, "rerun" should be "return"

Page 120:
        In the solution statement the phrase "Replace all references to the temp with the expression" should be replaced with "Replace all references to the temp with the new method"

Page 121 :
        
        In the last step of the mechanics, I say to use Replace Temp with Query (120), this should be replaced with a reference to Inline Temp (119). Otherwise I'd get a recursive refactoring. The problem continues in the example on page 122 where again the cross reference should be to Inline Temp (119). This was fixed incorrectly in the 8th printing (see below)
[Corrected in the 8th Printing]

Page 121:
        This was an incorrect fix to an earlier error. In the last line of the mechanics the refactoring 'Replace Temp with Inline Temp' should read 'Inline Temp'. The same problem occurs on page 122.

Page 153:
        In the second para, third line "As discussed in Lea by section..." should read "As discussed in Lea in section...."

Page 176:
        In the second para, (a step in the mechanics) "change the getting method" should read "change the setting method"

Page 176 :
        
        In the method numberOfOrdersFor the line that reads if (each.getCustomerName().equals(customer)) result++; should read if (each.getCustomer().equals(customer)) result++;
[Corrected in the 8th Printing]

Page 177 :
        
        In the first state of the method setCustomer the line that reads _customer = new Customer (customer); should read _customer = new Customer (arg);
[Corrected in the 8th Printing]

Page 185:
        In the second paragraph "biwise xor" shoudl read "bitwise xor"

Page 193 :
        
"to declare that interval window implements Observable" should read  "to declare that interval window implements Observer" [Corrected in the 5th Printing]

Page 219 :
        
        "In a paragraph at around the middle of page, the sentence "...need a new method that returns the code" should read "...need a new method that returns an instance of the new class."
[Corrected in the 8th Printing]

Page 222 :
        
        "In the crossed out code, the method "public int getBloodGroup() {" should be "public int getBloodGroupCode() {" (I had just renamed it!)"
[Corrected in the 8th Printing]

Page 222:
        At the bottom of the page I make the method getCode private. I obviously can't do that while any clients of BloodGroup are using the method.

Page 225:
        The first mention of the create method is missing the static keyword.

Page 240:
        On this page and on later pages I use the method isNotEligibleForDisability. Since my spell checker doesn't look at code it didn't tell me that the correct spelling is Eligable.

Page 241 :
        
In the code examples at the bottom of the page, the method isEligibleForDisability
should be isNotEligibleForDisability [Corrected in the 4th Printing]

Page 261 :
        
In Ron's story, 4th para, "Of course, as soon as you being inspecting..." but should be "Of course, as soon as you begin
inspecting..."
  [Corrected in the 5th Printing]

Page 285 :
        
        The before code contains a rather more serious error than the refactoring is meant to help with as the assertion is always executed.
        The before code should read:
        


        void setValue (String name, int value) {
                if (name.equals("height")) {
                        _height = value;
                        return;
                }
                if (name.equals("width")) {
                        _width = value;
                        return;
                }
                Assert.shouldNeverReachHere();
        }
        

[Corrected in the 8th Printing]

Page 300 :
        
        In the mechanics section the field should be made final at the end
        of process not at the begining.
[Corrected in the 5th Printing]

Page 301:
        There are problems with the example, see the discussion in RemoveSettingMethod.

Page 307 :
        
"Another reason to be wary of class.forName is that..."
should be:
"Another reason to be wary of Class.forName is that..." (Class should have a capital C)
[Corrected in the 5th Printing]

Page 307 :
        
"I can use a differenct approach...."
should be:
"I can use a different approach..." (spelling) [Corrected in the 5th Printing]

Page 311 :
        
"If the exception us checked, adjust the callers..."
should be:
"If the exception is checked, adjust the callers..."
[Corrected in the 5th Printing]

Page 313 :
        
        

The line of code that says

    
        
        Assert.isTrue("amount too large", amount > _balance);
        

        

is in error as the sense of the boolean is the wrong way round. A better line would be
        


        
        Assert.isTrue("sufficient funds", amount <= _balance);
        

[Corrected in the 8th Printing]

Page 315 :
        
        The problem statement should read "You are throwing an exception
        on a condition the caller could have checked first" (the refactoring applies to all exceptions, not just checked ones)
[Corrected in the 4th Printing]

Page 324 :
        
        In the top code example the line double chargeAmount = charge (lastBillDate, date) should read double chargeAmount = chargeFor (lastBillDate, date). (I got the method name inconsistent with the diagrams.)
        
[Corrected in the 8th Printing]

Page 328 :
        
        In the motivation paragraph "Pull Down Method" should read "Push Down Method". (This is what happens when I don't use links for everything!)
        
[Corrected in the 8th Printing]

Page 333 :
        
"arguments are needed by the labor item, and some are not"
should be: "some arguments are needed..." (missing word) [Corrected in the 5th Printing]

Page 346 :
        
"Whenever we see two similar method" should be: "Whenever we
see two similar methods" (plural) [Corrected in the 5th Printing]

Page 346 :
        
"The statement method prints statements" should be: "The
statement method prints statements" (font) [Corrected in the 5th Printing]

Page 355 :
        
first line of section "Motivation", "...Replace Delegation with Inheritance (355)" should read "Replace Inheritance with Delegation (352)"  [Corrected in the 3rd Printing]

Page 363:
        The references to the refactorings on this page are cross referenced with chapter references rather than the usual page references. Worse still, the chapter for Extract Class should be Chapter 7.

Page 390 :
        
"...vivc.edu" should be "uiuc.edu"  [Corrected in the 3rd Printing]

Page 405 :
        
Parse tree for program should have "hello" (method name) in lower-case.
[Corrected in the 3rd Printing]

Page 405 :
        
Last box on bottom right should have "Hello World" (not "out")  [Corrected in the 3rd Printing]

Page 414 :
        
Reference to JUnit in the URL "compuserv" should be "compuserve"
[Corrected in the 3rd Printing]


Corrected version of fig 4.1 on page 92.



corrected figure 4.1





***** 아름다운프로님에 의해서 게시물 복사 + 카테고리변경되었습니다 (2003-12-18 17:27)
Posted by 아름프로

Wrap entities with session


Entity beans from the business tier are exposed to clients in another tier

Use a Session Facade to encapsulate the entity beans


For further information see page 104 of Core J2EE Patterns by Alur, Crupi, and Malks




***** 아름다운프로님에 의해서 게시물 복사 + 카테고리변경되었습니다 (2003-12-18 17:27)
Posted by 아름프로

Use a Connection Pool


Database connections are not shared. Instead, clients manage their own connections for making database invocations

Use a connection pool to pre-initialize multiple connections, improving scalability and performance


For further information see page 119 of Core J2EE Patterns by Alur, Crupi, and Malks




***** 아름다운프로님에 의해서 게시물 복사 + 카테고리변경되었습니다 (2003-12-18 17:27)
Posted by 아름프로

Substitute Algorithm


You want to replace an algorithm with one that is clearer.

Replace the body of the method with the new algorithm.


        String foundPerson(String[] people){
                for (int i = 0; i < people.length; i++) {
                        if (people[i].equals ("Don")){
                                return "Don";
                        }
                        if (people[i].equals ("John")){
                                return "John";
                        }
                        if (people[i].equals ("Kent")){
                                return "Kent";
                        }
                }
                return "";
        }



        String foundPerson(String[] people){
                List candidates = Arrays.asList(new String[] {"Don", "John", "Kent"});
                for (int i=0; i<people.length; i++)
                        if (candidates.contains(people[i]))
                                return people[i];
                return "";
        }


For more information see page 139 of Refactoring




***** 아름다운프로님에 의해서 게시물 복사 + 카테고리변경되었습니다 (2003-12-18 17:27)
Posted by 아름프로

Split Temporary Variable


You have a temporary variable assigned to more than once, but is not a loop variable nor a collecting temporary variable.

Make a separate temporary variable for each assignment.


                double temp = 2 * (_height + _width);
                System.out.println (temp);
                temp = _height * _width;
                System.out.println (temp);



                final double perimeter = 2 * (_height + _width);
                System.out.println (perimeter);
                final double area = _height * _width;
                System.out.println (area);


For more information see page 128 of Refactoring




***** 아름다운프로님에 의해서 게시물 복사 + 카테고리변경되었습니다 (2003-12-18 17:27)
Posted by 아름프로

Split Loop


Refactoring contributed by Martin Fowler

You have a loop that is doing two things

Duplicate the loop


void printValues() {
        double averageAge = 0;
        double totalSalary = 0;
        for (int i = 0; i < people.length; i++) {
                        averageAge += people[i].age;
                        totalSalary += people[i].salary;
        }
        averageAge = averageAge / people.length;
        System.out.println(averageAge);
        System.out.println(totalSalary);
}




void printValues() {
        double totalSalary = 0;
        for (int i = 0; i < people.length; i++) {
                        totalSalary += people[i].salary;
        }

        double averageAge = 0;
        for (int i = 0; i < people.length; i++) {
                        averageAge += people[i].age;
        }
        averageAge = averageAge / people.length;

        System.out.println(averageAge);
        System.out.println(totalSalary);
}

Motivation


You often see loops that are doing two different things at once, because they can do that with one pass through a loop. Indeed most programmers would feel very uncomfortable with this refactoring as it forces you to execute the loop twice - which is double the work.

But like so many optimizations, doing two different things in one loop is less clear than doing them separately. It also causes problems for further refactoring as it introduces temps that get in the way of further refactorings. So while refactoring, don't be afraid to get rid of the loop. When you optimize, if the loop is slow that will show up and it would be right to slam the loops back together at that point. You may be surprised at how often the loop isn't a bottleneck, or how the later refactorings open up another, more powerful, optimization.

Mechanics

  • Copy the loop and remove the differing pieces from each loop

  • Compile and test.

  • Reorganize the lines to group the loop with related code from outside the loop

  • Compile and test.

  • Consider applying
    Extract Method
    or
    Replace Temp with Query
    on each loop


Example

    Start with this code.


            private Person [] people;

            void printValues() {
                    double averageAge = 0;
                    double totalSalary = 0;
                    for (int i = 0; i < people.length; i++) {
                                    averageAge += people[i].age;
                                    totalSalary += people[i].salary;
                    }
                    averageAge = averageAge / people.length;
                    System.out.println(averageAge);
                    System.out.println(totalSalary);
            }

    The loop is calculating both the total salary and the average age. This is two separate tasks, which just happen to use the same data structure. So I'll split the loops for now, knowing I can optimize later.

    The first move is to copy the loop and remove from each leg one part of the calculation.

            void printValues() {
                    double averageAge = 0;
                    double totalSalary = 0;
                    for (int i = 0; i < people.length; i++) {
                                    totalSalary += people[i].salary;
                    }
                    for (int i = 0; i < people.length; i++) {
                                    averageAge += people[i].age;
                    }
                    averageAge = averageAge / people.length;
                    System.out.println(averageAge);
                    System.out.println(totalSalary);
            }

    I can now compile and test this.

    Then I can reorganize the text to group things together.


            void printValues() {
                    double totalSalary = 0;
                    for (int i = 0; i < people.length; i++) {
                                    totalSalary += people[i].salary;
                    }

                    double averageAge = 0;
                    for (int i = 0; i < people.length; i++) {
                                    averageAge += people[i].age;
                    }
                    averageAge = averageAge / people.length;

                    System.out.println(averageAge);
                    System.out.println(totalSalary);
            }


    One thing that has bothered me about this refactoring is that there's a lot of duplicate loop setup code - and duplication is the worst smell of all. On the whole, however, I don't feel that concerned about it. Fundamentally the duplication is due to the godawful way that Java does loops. Other modern languages with a foreach statement avoid the duplication completely.


    Officialy that's the end of the refactoring. But the important thing here is what it leads you to do. In this case I'm inclined to apply Replace Temp with Query to each loop.


            void printValues() {
                    System.out.println(averageAge());
                    System.out.println(totalSalary());
            }

            private double averageAge() {
                    double result = 0;
                    for (int i = 0; i < people.length; i++) {
                                    result += people[i].age;
                    }
                    return result / people.length;
            }

            private double totalSalary() {
                    double result = 0;
                    for (int i = 0; i < people.length; i++) {
                                    result += people[i].salary;
                    }
                    return result;
            }



Additional Comments


The split loop is an often used performance
optimisation in data intensive applications. When you are accessing to
separate arrays in the same loop you can get hit badly by the cache
misses. That is, if the arrays are large enough you loose locality of
reference and the cache fails to do the job. Put enough code here and
every operation will not hit the cache and instead have to go back out
to main memory.


By splitting loops up into small separate components that only act on
one array you get significant performance increases. In rendering code
I've seen up to an order of magnitude difference. This is particularly
beneficial if it is primitive type based and less so if class reference
or pointer based where you need an additional dereference off into a
random memory location. This technique is also very similar to loop
unravelling for performance gains (although something I doubt would ever
appear in a refactoring/patterns/OO type book :)

--Justin Couch

Thanks to Bob Bowman for spotting and fixing an error.



***** 아름다운프로님에 의해서 게시물 복사 + 카테고리변경되었습니다 (2003-12-18 17:27)
Posted by 아름프로

Separate Query from Modifier


You have a method that returns a value but also changes the state of an object.

Create two methods, one for the query and one for the modification.




For more information see page 279 of Refactoring




***** 아름다운프로님에 의해서 게시물 복사 + 카테고리변경되었습니다 (2003-12-18 17:27)
Posted by 아름프로

Separate Data Access Code



Data access code is embedded directly within a class that has other unrelated responsibilities

Extract the data access code into a new class and move the new class logically and/or physically closer to the data source



For further information see page 113 of Core J2EE Patterns by Alur, Crupi, and Malks




***** 아름다운프로님에 의해서 게시물 복사 + 카테고리변경되었습니다 (2003-12-18 17:27)
Posted by 아름프로

Self Encapsulate Field



You are accessing a field directly, but the coupling to the field is becoming awkward.

Create getting and setting methods for the field and use only those to access the field.



        private int _low, _high;
        boolean includes (int arg) {
                return arg >= _low && arg <= _high;
        }


        private int _low, _high;
        boolean includes (int arg) {
                return arg >= getLow() && arg <= getHigh();
        }
        int getLow() {return _low;}
        int getHigh() {return _high;}


For more information see page 171 of Refactoring




***** 아름다운프로님에 의해서 게시물 복사 + 카테고리변경되었습니다 (2003-12-18 17:27)
Posted by 아름프로

Reverse Conditional


Refactoring contributed by Bill Murphy and Martin Fowler

You have a conditional that would be easier to understand if you reversed its sense.

Reverse the sense of the conditional and reorder the conditional's clauses.



if ( !isSummer( date ) )
  charge = winterCharge( quantity );
else
  charge = summerCharge( quantity );


if ( isSummer( date ) )
  charge = summerCharge( quantity );
else
  charge = winterCharge( quantity );

Motivation


Often conditionals can be phrased in way that makes them hard to read. This is particularly the case when they have a not in front of them. If the conditional only has a "then" clause and no "else" clause, this is reasonable. However if the conditional has both clauses, then you might as well reverse the conditional.

Mechanics

  • Remove negative from conditional.

  • Switch clauses

  • Compile and test.


There's further discussion on this kind of refactoring on the wiki.




***** 아름다운프로님에 의해서 게시물 복사 + 카테고리변경되었습니다 (2003-12-18 17:27)
Posted by 아름프로

Replace Type Code with Subclasses


You have an immutable type code that affects the behavior of a class.

Replace the type code with subclasses.




For more information see page 223 of Refactoring




***** 아름다운프로님에 의해서 게시물 복사 + 카테고리변경되었습니다 (2003-12-18 17:27)
Posted by 아름프로

Replace Type Code with State/Strategy


You have a type code that affects the behavior of a class, but you cannot use subclassing.

Replace the type code with a state object.


        

For more information see page 227 of Refactoring




***** 아름다운프로님에 의해서 게시물 복사 + 카테고리변경되었습니다 (2003-12-18 17:27)
Posted by 아름프로

Replace Type Code with Class


A class has a numeric type code that does not affect its behavior.

Replace the number with a new class.





For more information see page 218 of Refactoring

Corrections


Privitizing the accessors for the type code


At the end of the refactoring I said that you could make those methods that use the type code, eg getCode(), private. I neglected to say that you first have to find the callers of those methods and change them to no longer use the code number.

Contributors

  • Randy Coulman




***** 아름다운프로님에 의해서 게시물 복사 + 카테고리변경되었습니다 (2003-12-18 17:27)
Posted by 아름프로

Replace Temp with Query


You are using a temporary variable to hold the result of an expression.

Extract the expression into a method. Replace all references to the temp with the expression. The new method can then be used in other methods.


                double basePrice = _quantity * _itemPrice;
                if (basePrice > 1000)
                        return basePrice * 0.95;
                else
                        return basePrice * 0.98;


                if (basePrice() > 1000)
                        return basePrice() * 0.95;
                else
                        return basePrice() * 0.98;
...
        double basePrice() {
                return _quantity * _itemPrice;
        }


For more information see page 120 of Refactoring

Additional Comments


Side Effects


Paul Haahr pointed out that you can't do this refactoring if the code in between the the assignment to the temp and the use of the temp changes the value of the expression that calculates the temp. In these cases the code is using the temp to snapshot the value of the temp when it's assigned. The name of the temp should convey this fact (and you should change the name if it doesn't).

He also pointed out that it is easy to forget that creating a reference object is a side effect, while creating a value object isn't.

Contributors

  • Paul Haahr





***** 아름다운프로님에 의해서 게시물 복사 + 카테고리변경되었습니다 (2003-12-18 17:27)
Posted by 아름프로

Replace Subclass with Fields


You have subclasses that vary only in methods that return constant data.

Change the methods to superclass fields and eliminate the subclasses.


        

For more information see page 232 of Refactoring




***** 아름다운프로님에 의해서 게시물 복사 + 카테고리변경되었습니다 (2003-12-18 17:27)
Posted by 아름프로

Replace Static Variable with Parameter


Refactoring contributed by Marian Vittek


A function depending on a static variable needs to be reused in more general context.

Add a new parameter to the function and replace all references of the static variable within the function by this new parameter.



void printValues() {
        for (int i = 0; i < people.length; i++) {
                System.out.println(people[i].name+" has salary "+people[i].salary);
        }
}

public static void main(String args[]) {
        ...
        printValues();
}




void printValues(PrintStream outfile) {
        for (int i = 0; i < people.length; i++) {
                outfile.println(people[i].name+" has salary "+people[i].salary);
        }
}

public static void main(String args[]) {
        ...
        printValues(System.out);
}

Motivation

The original function is using a static variable, but you wish either to reuse the function in new project (not containing the static variable) or reuse the function in the same project but in more general context.

Mechanics

  • If the function calls other functions using the static variable in question, then use this refactoring on all those invoked functions first.

  • Use Add Parameter to add a new argument to the function

  • Add the static variable as actual argument to all callers of this function in.

  • Replace all references to the static variable within the function by the new argument





***** 아름다운프로님에 의해서 게시물 복사 + 카테고리변경되었습니다 (2003-12-18 17:27)
Posted by 아름프로

BLOG main image

카테고리

분류 전체보기 (539)
이야기방 (19)
토론/정보/사설 (16)
IBM Rational (9)
U-IT (0)
SOA/WS/ebXML (110)
개발방법론/모델링 (122)
J2SE (34)
J2EE (60)
DataBase (39)
Open Projects (30)
BP/표준화 (50)
Apache Projects (15)
Web/보안/OS (22)
Tools (7)
AJAX/WEB2.0 (1)
Linux/Unix (1)
영어 (0)
비공개방 (0)

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

달력

«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28

글 보관함

Total :
Today : Yesterday :