Software restructuring is recognized as a promising method to improve logical structure and to enhance understandability of a software system. Restructuring may make it possible to understand the system``s design more precisely, to avoid degradation of original designs during maintenance, and to enhance a probability of software being reused. It is most often used during software maintenance, where the lack of software structure often is most evident and expensive. However, it can also be applied in the earlier design and development phases. It is an integral part of achieving many goals in software maintenance and in corporate planning for software change. This dissertation defines a set of software restructuring methods that applied to software systems which do not conform to good software engineering principles in their early design and development phases and/or in maintenance phase. The focus of the dissertation is the restructuring methods at function-level and at system-level. In the research direction of function-level restructuring, the methods identify modules performing multiple functions and restructure such modules. For identifying the multi-function modules, the notion of the tightly-coupled module that performs a single specific function is formalized. This method utilizes information on data and control dependence, and applies program slicing to carrying out the task of extracting the tightly-coupled modules from the multi-function module. The identified multi-function module is restructured into a number of functional strength modules or an informational strength module. The module strength is used as a criterion to decide how to restructure. To attain the system``s consistency after restructuring, the change propagation method is provided. And also the methods for preserving the behavior of software system during restructuring is discussed. In the research direction of system-level restructuring, Two restructuring methods based on an analysis o...