Program Development in Java: Abstraction, Specification, and Object-Oriented Design 1st Edition by Barbara Liskov (PDF)

6

 

Ebook Info

  • Published: 2000
  • Number of pages: 443 pages
  • Format: PDF
  • File Size: 5.56 MB
  • Authors: Barbara Liskov

Description

Written by a world-renowned expert on programming methodology, and the winner of the 2008 Turing Award, this book shows how to build production-quality programs–programs that are reliable, easy to maintain, and quick to modify. Its emphasis is on modular program construction: how to get the modules right and how to organize a program as a collection of modules. The book presents a methodology effective for either an individual programmer, who may be writing a small program or a single module in a larger one; or a software engineer, who may be part of a team developing a complex program comprised of many modules. Both audiences will acquire a solid foundation for object-oriented program design and component-based software development from this methodology. Because each module in a program corresponds to an abstraction, such as a collection of documents or a routine to search the collection for documents of interest, the book first explains the kinds of abstractions most useful to programmers: procedures; iteration abstractions; and, most critically, data abstractions. Indeed, the author treats data abstraction as the central paradigm in object-oriented program design and implementation. The author also shows, with numerous examples, how to develop informal specifications that define these abstractions–specifications that describe what the modules do–and then discusses how to implement the modules so that they do what they are supposed to do with acceptable performance. Other topics discussed include: Encapsulation and the need for an implementation to provide the behavior defined by the specification Tradeoffs between simplicity and performance Techniques to help readers of code understand and reason about it, focusing on such properties as rep invariants and abstraction functions Type hierarchy and its use in defining families of related data abstractions Debugging, testing, and requirements analysis Program design as a top-down, iterative process, and design patterns The Java programming language is used for the book’s examples. However, the techniques presented are language independent, and an introduction to key Java concepts is included for programmers who may not be familiar with the language.

User’s Reviews

Editorial Reviews: From the Inside Flap Constructing production-quality programs–programs that are used over an extended period of time–is well known to be extremely difficult. The goal of this book is to improve the effectiveness of programmers in carrying out this task. I hope the reader will become a better programmer as a result of reading the book. I believe the book succeeds at improving programming skills because my students tell me that it happens for them. What makes a good programmer? It is a matter of efficiency over the entire production of a program. The key is to reduce wasted effort at each stage. Things that can help include thinking through your implementation before you start coding, coding in a way that eliminates errors before you test, doing rigorous testing so that errors are found early, and paying careful attention to modularity so that when errors are discovered, they can be corrected with minimal impact on the program as a whole. This book covers techniques in all these areas. Modularity is the key to writing good programs. It is essential to break up a program into small modules, each of which interacts with the others through a narrow, well-defined interface. With modularity, an error in one part of a program can be corrected without having to consider all the rest of the code, and a part of the program can be understood without having to understand the entire thing. Without modularity, a program is a large collection of intricately interrelated parts. It is difficult to comprehend and to modify such a program, and also difficult to get it to work correctly.The focus of this book therefore is on modular program construction: how to organize a program as a collection of well-chosen modules. The book relates modularity to abstraction. Each module corresponds to an abstraction, such as an index that keeps track of interesting words in a large collection of documents or a procedure that uses the index to find documents that match a particular query. Particular emphasis is placed on object-oriented programming–the use of data abstraction and objects in developing programs. The book uses Java for its programming examples. Familiarity with Java is not assumed. It is worth noting, however, that the concepts in this book are language independent and can be used to write programs in any programming language. How Can the Book Be Used? Program Development in Java can be used in two ways. The first is as the text for a course that focuses on an object-oriented methodology for the design and implementation of complex systems. The second is use by computing professionals who want to improve their programming skills and their knowledge of modular, object-oriented design.When used as a text, the book is intended for a second or third programming course; we have used the book for many years in the second programming course at MIT, which is taken by sophomores and juniors. At this stage, students already know how to write small programs. The course builds on this material in two ways: by getting them to think more carefully about small programs, and by teaching them how to construct large programs using smaller ones as components. This book could also be used later in the curriculum, for example, in a software engineering course.A course based on the book is suitable for all computer science majors. Even though many students will never be designers of truly large programs, they may work at development organizations where they will be responsible for the design and implementation of subsystems that must fit into the overall structure. The material on modular design is central to this kind of a task. It is equally important for those who take on larger design tasks. What Is This Book About? Roughly two-thirds of the book is devoted to the issues that arise in building individual program modules. The remainder of the book is concerned with how to use these modules to construct large programs.Program Modules This part of the book focuses on abstraction mechanisms. It discusses procedures and exceptions, data abstraction, iteration abstraction, families of data abstractions, and polymorphic abstractions.Three activities are emphasized in the discussion of abstractions. The first is deciding on exactly what the abstraction is: what behavior it is providing to its users. Inventing abstractions is a key part of design, and the book discusses how to choose among possible alternatives and what goes into inventing good abstractions.The second activity is capturing the meaning of an abstraction by giving a specification for it. Without some description, an abstraction is too vague to be useful. The specification provides the needed description. This book defines a format for specifications, discusses the properties of a good specification, and provides many examples.The third activity is implementing abstractions. The book discusses how to design an implementation and the trade-off between simplicity and performance. It emphasizes encapsulation and the need for an implementation to provide the behavior defined by the specification. It also presents techniques–in particular, the use of representation invariants and abstraction functions–that help readers of code to understand and reason about it. Both rep invariants and abstraction functions are implemented to the extent possible, which is useful for debugging and testing.The material on type hierarchy focuses on its use as an abstraction technique–a way of grouping related data abstractions into families. An important issue here is whether it is appropriate to define one type to be a subtype of another. The book defines the {substitution principle}–a methodical way for deciding whether the subtype relation holds by examining the specifications of the subtype and the supertype.This book also covers debugging and testing. It discusses how to come up with a sufficient number of test cases for thorough black box and glass box tests, and it emphasizes the importance of regression testing. Programming in the Large The latter part of Program Development in Java is concerned with how to design and implement large programs in a modular way. It builds on the material about abstractions and specifications covered in the earlier part of the book.The material on programming in the large covers four main topics. The first concerns requirements analysis–how to develop an understanding of what is wanted of the program. The book discusses how to carry out requirements analysis and also describes a way of writing the resulting requirements specification, by making use of a {data model} that describes the abstract state of the program. Using the model leads to a more precise specification, and it also makes the requirements analysis more rigorous, resulting in a better understanding of the requirements.The second programming in the large topic is program design, which is treated as an iterative process. The design process is organized around discovering useful abstractions, ones that can serve as desirable building blocks within the program as a whole. These abstractions are carefully specified during design so that when the program is implemented, the modules that implement the abstractions can be developed independently. The design is documented by a design notebook, which includes a module dependency diagram that describes the program structure.The third topic is implementation and testing. The book discusses the need for design analysis prior to implementation and how design reviews can be carried out. It also discusses implementation and testing order. This section compares top-down and bottom-up organizations, discusses the use of drivers and stubs, and emphasizes the need to develop an ordering strategy prior to implementation that meets the needs of the development organization and its clients.This book concludes with a chapter on design patterns. Some patterns are introduced in earlier chapters; for example, iteration abstraction is a major component of the methodology. The final chapter discusses patterns not covered earlier. It is intended as an introduction to this material. The interested reader can then go on to read more complete discussions contained in other books. Barbara Liskov 0201657686P04062001 From the Back Cover Written by a world-renowned expert on programming methodology, and the winner of the 2008 Turing Award, this book shows how to build production-quality programs–programs that are reliable, easy to maintain, and quick to modify. Its emphasis is on modular program construction: how to get the modules right and how to organize a program as a collection of modules. The book presents a methodology effective for either an individual programmer, who may be writing a small program or a single module in a larger one; or a software engineer, who may be part of a team developing a complex program comprised of many modules. Both audiences will acquire a solid foundation for object-oriented program design and component-based software development from this methodology. Because each module in a program corresponds to an abstraction, such as a collection of documents or a routine to search the collection for documents of interest, the book first explains the kinds of abstractions most useful to programmers: procedures; iteration abstractions; and, most critically, data abstractions. Indeed, the author treats data abstraction as the central paradigm in object-oriented program design and implementation. The author also shows, with numerous examples, how to develop informal specifications that define these abstractions–specifications that describe what the modules do–and then discusses how to implement the modules so that they do what they are supposed to do with acceptable performance. Other topics discussed include: Encapsulation and the need for an implementation to provide the behavior defined by the specification Tradeoffs between simplicity and performance Techniques to help readers of code understand and reason about it, focusing on such properties as rep invariants and abstraction functions Type hierarchy and its use in defining families of related data abstractions Debugging, testing, and requirements analysis Program design as a top-down, iterative process, and design patterns The Java programming language is used for the book’s examples. However, the techniques presented are language independent, and an introduction to key Java concepts is included for programmers who may not be familiar with the language. About the Author Barbara Liskov is professor of computer science at MIT. Well known for her contributions to programming methodology and software engineering, she is co-author (with John Guttag) of the influential book, Abstraction and Specification in Program Development. Barbara is the recipient of the 2008 A.M. Turing Award, one of the highest honors in science and engineering. 0201657686AB04062001 Excerpt. © Reprinted by permission. All rights reserved. Constructing production-quality programs–programs that are used over an extended period of time–is well known to be extremely difficult. The goal of this book is to improve the effectiveness of programmers in carrying out this task. I hope the reader will become a better programmer as a result of reading the book. I believe the book succeeds at improving programming skills because my students tell me that it happens for them. What makes a good programmer? It is a matter of efficiency over the entire production of a program. The key is to reduce wasted effort at each stage. Things that can help include thinking through your implementation before you start coding, coding in a way that eliminates errors before you test, doing rigorous testing so that errors are found early, and paying careful attention to modularity so that when errors are discovered, they can be corrected with minimal impact on the program as a whole. This book covers techniques in all these areas. Modularity is the key to writing good programs. It is essential to break up a program into small modules, each of which interacts with the others through a narrow, well-defined interface. With modularity, an error in one part of a program can be corrected without having to consider all the rest of the code, and a part of the program can be understood without having to understand the entire thing. Without modularity, a program is a large collection of intricately interrelated parts. It is difficult to comprehend and to modify such a program, and also difficult to get it to work correctly. The focus of this book therefore is on modular program construction: how to organize a program as a collection of well-chosen modules. The book relates modularity to abstraction. Each module corresponds to an abstraction, such as an index that keeps track of interesting words in a large collection of documents or a procedure that uses the index to find documents that match a particular query. Particular emphasis is placed on object-oriented programming–the use of data abstraction and objects in developing programs.The book uses Java for its programming examples. Familiarity with Java is not assumed. It is worth noting, however, that the concepts in this book are language independent and can be used to write programs in any programming language.How Can the Book Be Used?Program Development in Java can be used in two ways. The first is as the text for a course that focuses on an object-oriented methodology for the design and implementation of complex systems. The second is use by computing professionals who want to improve their programming skills and their knowledge of modular, object-oriented design. When used as a text, the book is intended for a second or third programming course; we have used the book for many years in the second programming course at MIT, which is taken by sophomores and juniors. At this stage, students already know how to write small programs. The course builds on this material in two ways: by getting them to think more carefully about small programs, and by teaching them how to construct large programs using smaller ones as components. This book could also be used later in the curriculum, for example, in a software engineering course. A course based on the book is suitable for all computer science majors. Even though many students will never be designers of truly large programs, they may work at development organizations where they will be responsible for the design and implementation of subsystems that must fit into the overall structure. The material on modular design is central to this kind of a task. It is equally important for those who take on larger design tasks. What Is This Book About? Roughly two-thirds of the book is devoted to the issues that arise in building individual program modules. The remainder of the book is concerned with how to use these modules to construct large programs. Program Modules This part of the book focuses on abstraction mechanisms. It discusses procedures and exceptions, data abstraction, iteration abstraction, families of data abstractions, and polymorphic abstractions. Three activities are emphasized in the discussion of abstractions. The first is deciding on exactly what the abstraction is: what behavior it is providing to its users. Inventing abstractions is a key part of design, and the book discusses how to choose among possible alternatives and what goes into inventing good abstractions. The second activity is capturing the meaning of an abstraction by giving a specification for it. Without some description, an abstraction is too vague to be useful. The specification provides the needed description. This book defines a format for specifications, discusses the properties of a good specification, and provides many examples. The third activity is implementing abstractions. The book discusses how to design an implementation and the trade-off between simplicity and performance. It emphasizes encapsulation and the need for an implementation to provide the behavior defined by the specification. It also presents techniques–in particular, the use of representation invariants and abstraction functions–that help readers of code to understand and reason about it. Both rep invariants and abstraction functions are implemented to the extent possible, which is useful for debugging and testing. The material on type hierarchy focuses on its use as an abstraction technique–a way of grouping related data abstractions into families. An important issue here is whether it is appropriate to define one type to be a subtype of another. The book defines the {substitution principle}–a methodical way for deciding whether the subtype relation holds by examining the specifications of the subtype and the supertype. This book also covers debugging and testing. It discusses how to come up with a sufficient number of test cases for thorough black box and glass box tests, and it emphasizes the importance of regression testing. Programming in the Large The latter part of Program Development in Java is concerned with how to design and implement large programs in a modular way. It builds on the material about abstractions and specifications covered in the earlier part of the book. The material on programming in the large covers four main topics. The first concerns requirements analysis–how to develop an understanding of what is wanted of the program. The book discusses how to carry out requirements analysis and also describes a way of writing the resulting requirements specification, by making use of a {data model} that describes the abstract state of the program. Using the model leads to a more precise specification, and it also makes the requirements analysis more rigorous, resulting in a better understanding of the requirements. The second programming in the large topic is program design, which is treated as an iterative process. The design process is organized around discovering useful abstractions, ones that can serve as desirable building blocks within the program as a whole. These abstractions are carefully specified during design so that when the program is implemented, the modules that implement the abstractions can be developed independently. The design is documented by a design notebook, which includes a module dependency diagram that describes the program structure. The third topic is implementation and testing. The book discusses the need for design analysis prior to implementation and how design reviews can be carried out. It also discusses implementation and testing order. This section compares top-down and bottom-up organizations, discusses the use of drivers and stubs, and emphasizes the need to develop an ordering strategy prior to implementation that meets the needs of the development organization and its clients. This book concludes with a chapter on design patterns. Some patterns are introduced in earlier chapters; for example, iteration abstraction is a major component of the methodology. The final chapter discusses patterns not covered earlier. It is intended as an introduction to this material. The interested reader can then go on to read more complete discussions contained in other books. Barbara Liskov 0201657686P04062001 Read more

Reviews from Amazon users which were colected at the time this book was published on the website:

⭐Even though “Java” is mentioned in the title of this book, it is not a book on programming in Java. It is much better than that. Plenty of books exist to teach the syntax of Java already; this book provides excellent discussions on designing good programming modules (e.g. classes) that are cohesive units without undesired coupling to other modules in one’s design. The discussions of the concepts of mutability, representation-invariants, adequacy, and object specifications are the best I have seen, and Liskov uses these concepts to show how to build extensible classes. This book also has good information about the whole process of developing software; it does not focus on coding, but it does discuss implementing key concepts using Java as the implementation language.This book is not the Java version of some C++ book, but is an excellent software design and development book updated to use Java instead of a custom language called CLU that was used in the previous version. Those looking for a book on good Java usage should check out _Practical_Java_ by Haggar or something similar.

⭐This book was required for a class that I am taking. The copywrite date is 2001 with the current printing edition in 2002. The course instructor refers to the author as a mathematician. This shows in the writing style of the author. Her examples tend to refer to mathematical concepts like sets and polynomials. That’s ok, but it would be nice if she could have expanded the examples into other domains. My two big complains so far are the small number of examples in each chapter and her tendency to use one letter names for variables. I don’t know what they teach at MIT, but in many other parts of the country they recognized the benefit of longer, more descriptive names in the 1990’s (probably earlier). I am only in chapter 5 of a 15 chapter book. Maybe it gets better. Right now I wouldn’t buy it if I didn’t have to for a class.

⭐Fantastic book for anyone interested in Java Programming. It’s not a beginner level book. Barbara Liskov has done a great book in keeping the content just enough and not difficult to understand. I would recommend buying this book. Especially considering it is not at all expensive.

⭐Good book

⭐Dull, frustrating read. Pass and read one of the many other Java OO design books. Was hoping for more from Liskov (a well known name in CS and OO specifically).

⭐I have some problems understanding inheritance and other OO terms. This book teach not only the meaning of those term but also teach the advantages and how to use them. After reading this book, i know why those term is very important (inheritance, abstraction, etc) and can use it in my programming life.If you’d like to become java expert, buy this book.

⭐Poorly written book with terrible examples.

⭐Barbara Liskov brings name recogntion the text. Respect comes for reasons, though, and this book shows many good reasons for respecting this educator and her co-author.This would be a good book for a second or third course in comptuer science. Even so, seasoned pros should take this book seriously. The reader is assumed to be familiar with basic programming and data structures. The reader is also assumed to be familiar with Java – “development in Java” means that Java is the vehicle, not the topic being taught.Techniques in this book are a level above the most concrete. It’s premise is that any piece of code must be viewed in many different ways; right and wrong answers are the least of it. The book starts with a simple but rigorous set of commenting conventions – it makes one wish for a truly rigorous programming language. For each method, one specifies its prerequisites or assumptions, the set of objects with state chaged by the method, and the specifics of the change being made. The authors focus clearly on ambiguous specification at this level; explicitly undefined behavior has a valid role in many rigorous designs. This leads naturally to discussion of parameter checking, error handling, and proper use of thrown exceptions.The authors develop a few unusual but critical ideas, including mutability – the possibility that an objects data content can change after creation. In well-disciplined programs, this property has far-reaching implications. Liskov and Guttag involve mutability in equality testing, object identity vs. data equality, and valid naming or indexing.Encapsulation and data hiding have long been design staples, but the authors’ examination keeps the idea fresh. They discuss, from the standpoint of provable correctness, how data exposure puts programs at risk. They also make clear how, viewed with an eye to maintainability, the risks of even read-only exposure of an object’s data content. They stop short of discussing true formal verification or industrial practice, though, a decision I think appropriate to the book’s level. Readers with deeper knowledge can still appreciate the discussion at its implicitly deeper levels.By the time the authors address high-level system specification, it seems almost obvious. Without high-level specification, there would be no way to fill in the more detailed specifications that now come naturally to the reader. The authors also address that tricky moment between specification and implementation: the intuitive process of design.Only the end of the book disappointed me, a half-hearted presentation of design patterns. It seems almost perfuctory, presenting DPs just because it’s the done thing, not because the authors add their usual depth to the topic.I really wish I had more upper-level students and professional colleagues who had been trained according to these authors’ program. Their software designs, as students and as professionals, would be stronger and safer if they had.

⭐Only bought for Masters degree, too much theory and very little hands-on, this is a nice book for when you already know what you are doing so beginners should stay clear.

⭐Alcune parti di questo libro sono veramente eccellenti e ben scritte, di indubbia utilità. Poi però ci si trova davanti a parti completamente sorpassate, come il capitolo sul polimorfismo che è assolutamente obsoleto grazie a feature di Java successive alla sua scrittura. Veramente eccessivamente accademico in alcune parti, a tal punto che seguire pedissequamente le indicazioni contenute del libro renderebbe impossibile portare a termine un qualsiasi progetto. Alcune parti sono veramente difficili da seguire in quanto particolarmente pesanti.In compenso, però, vengono spiegati bene molti concetti e pattern non solo interessanti ma anche di indubbia utilità.4 stelle anziché 5 perché la consegna è stata lunghetta. Ordinato il 10 ottobre con consegna prevista tra 18 e 24 ottobre, è arrivato il 25. Ma libro in ottimo statoThe content of this book is ok. Not sure how much it helped me with my course, but I thought it was pretty straight forward.

⭐nice

Keywords

Free Download Program Development in Java: Abstraction, Specification, and Object-Oriented Design 1st Edition in PDF format
Program Development in Java: Abstraction, Specification, and Object-Oriented Design 1st Edition PDF Free Download
Download Program Development in Java: Abstraction, Specification, and Object-Oriented Design 1st Edition 2000 PDF Free
Program Development in Java: Abstraction, Specification, and Object-Oriented Design 1st Edition 2000 PDF Free Download
Download Program Development in Java: Abstraction, Specification, and Object-Oriented Design 1st Edition PDF
Free Download Ebook Program Development in Java: Abstraction, Specification, and Object-Oriented Design 1st Edition

Previous articleAdvanced Topics in Computer Vision (Advances in Computer Vision and Pattern Recognition) 2013th Edition by Giovanni Maria Farinella (PDF)
Next articleSpectral Interpretation of Decision Diagrams 2003rd Edition by Radomir Stankovic (PDF)