Код с запашком

Код с запашко́м (код с душко́м, дурно пахнущий код) — термин, обозначающий код с признаками (запахами) проблем в системе. Был введён Кентом Беком[1] и использован Мартином Фаулером в его книге «Рефакторинг. Улучшение существующего кода»[1].

Запахи кода (англ. code smells) — это ключевые признаки необходимости рефакторинга[2]. Существуют запахи, специфичные как для парадигм программирования, так и для конкретных языков. Основной проблемой, с которой сталкиваются разработчики при борьбе с запахами кода, является то, что критерии своевременности рефакторинга невозможно чётко формализовать без апелляции к эстетике и условному чувству прекрасного. Запахи кода — это не набор чётких правил, а описание мест, на которые нужно обращать внимание при рефакторинге[3]. Они легко обнаруживаются, но при этом не во всех случаях свидетельствуют о проблемах[1].

Код с запашком ведёт к деградации кода (снижению его качества), и разработчики должны стремиться к устранению запашков путём применения однократного или многократного рефакторинга[4]. В процессе рефакторинга происходит избавление от запахов кода, что обеспечивает возможность дальнейшего развития приложения с той же или большей скоростью. Отсутствие регулярного рефакторинга с течением времени способно полностью парализовать проект, поэтому запахи кода необходимо устранять на ранних стадиях[2]. Существуют инструменты поиска и исправления запахов кода[5], однако опыт показывает, что никакие системы показателей не могут соперничать с человеческой интуицией, основанной на информации[6].

Запахи кода

Общие запахи объектно-ориентированного кода

Дублирование кода

Пример трёхкратного дублирования кода и избавления от этого «запашка» с помощью выделения метода и последующих вызовов кода созданного метода

Дублирование кода — это использование одинаковых структур кода в нескольких местах. Объединение этих структур позволит улучшить программный код[6].

Примеры дублирования и методы их устранения:

  • Одно и то же выражение присутствует в двух методах одного и того же класса: необходимо применить «Выделение метода» (Extract Method) и вызывать код созданного метода из обеих точек;
  • Одно и то же выражение есть в двух подклассах, находящихся на одном уровне: необходимо применить «Выделение метода» (Extract Method) для обоих классов с последующим «Подъёмом поля» (Pull Up Field) или «Формированием шаблона метода» (Form Template Method), если код похож, но не совпадает полностью. Если оба метода делают одно и то же с помощью разных алгоритмов, можно выбрать более чёткий из этих алгоритмов и применить «Замещение алгоритма» (Substitute Algorithm);
  • Дублирующийся код находится в двух разных классах: необходимо применить «Выделение класса» (Extract Class) в одном классе, а затем использовать новый компонент в другом[6].

Длинный метод

Среди объектных программ дольше всего живут программы с короткими методами. Чем длиннее процедура, тем труднее её понять. Если у метода хорошее название, то не нужно смотреть его тело[3].

Следует придерживаться эвристического правила: если ощущается необходимость что-то прокомментировать, нужно написать метод. Даже одну строку имеет смысл выделить в метод, если она нуждается в разъяснениях[7].

  • Для сокращения метода достаточно применить «Выделение метода» (Extract Method);
  • Если локальные переменные и параметры препятствуют выделению метода, можно применить «Замену временной переменной вызовом метода» (Replace Temp with Query), «Введение граничного объекта» (Introduce Parameter Object) и «Сохранение всего объекта» (Preserve Whole Object)[3];
  • Условные операторы и циклы свидетельствуют о возможности выделения в отдельный метод. Для работы с условными выражениями подходит «Декомпозиция условных операторов» (Decompose Conditional). Для работы с циклом — «Выделение метода» (Extract Method)[7].

Большой класс

Когда класс реализует слишком обширную функциональность, стоит подумать о вынесении некоторой части кода в подкласс. Это избавит разработчиков от чрезмерного количества имеющихся у класса атрибутов и дублирования кода[7].

  • Для уменьшения класса используется «Выделение класса» (Extract Class) или «Выделение подкласса» (Extract Subclass). При этом следует обращать внимание на общность в названии атрибутов и на то, использует ли класс их все одновременно[3];
  • Если большой класс является классом GUI, может потребоваться переместить его данные и поведение в отдельный объект предметной области. При этом может оказаться необходимым хранить копии некоторых данных в двух местах и обеспечить их согласованность. «Дублирование видимых данных» (Duplicate Observed Data) предлагает путь, которым можно это осуществить[8].

Длинный список параметров

В длинных списках параметров трудно разбираться, они становятся противоречивыми и сложными в использовании. Использование объектов позволяет, в случае изменения передаваемых данных, модифицировать только сам объект. Работая с объектами, следует передавать ровно столько, чтобы метод мог получить необходимые ему данные[8].

  • «Замена параметра вызовом метода» (Replace Parameter with Method) применяется, когда можно получить данные путём вызова метода объекта. Этот объект может быть полем или другим параметром.
  • «Сохранение всего объекта» (Preserve Whole Object) позволяет взять группу данных, полученных от объекта, и заменить их самим объектом.
  • «Введение граничного объекта» (Introduce Parameter Object) применяется, если есть несколько элементов данных без логического объекта[8].

Расходящиеся модификации

Проблема возникает, когда при модификации в системе невозможно выделить определённое место, которое нужно изменить. Это является следствием плохой структурированности ПО[8] или программирования методом копирования-вставки.

  • Если набор методов необходимо изменять каждый раз при внесении определённых модификаций в код, то применяется «Выделение класса» (Extract Class) (Например, три метода меняются каждый раз когда подключается новая БД, а четыре — при добавлении финансового инструмента)[3].

Стрельба дробью

При выполнении любых модификаций приходится вносить множество мелких изменений в большое число классов. «Стрельба дробью» похожа на «Расходящуюся модификацию», но является её противоположностью. Расходящаяся модификация имеет место, когда есть один класс, в котором производится много различных изменений, а «Стрельба дробью» — это одно изменение, затрагивающее много классов[9].

  • Вынести все изменения в один класс позволят «Перемещение метода» (Move Method) и «Перемещение поля» (Move Field);
  • Если нет подходящего класса, то следует создать новый класс;
  • Если это необходимо, следует воспользоваться «Встраиванием класса» (Inline Class)[3].

Завистливые функции

Метод обращается к данным другого объекта чаще, чем к собственным данным[3].

  • «Перемещение метода» (Move Method) применяется, если метод явно следует перевести в другое место;
  • «Выделение метода» (Extract Method) применяется к части метода, если только эта часть обращается к данным другого объекта;
  • Метод использует функции нескольких классов: определяется, в каком классе находится больше всего данных, и метод помещается в класс вместе с этими данными, или с помощью «Выделения метода» (Extract Method) метод разбивается на несколько частей и они помещаются в разные места[10].

Фундаментальное практическое правило гласит: то, что изменяется одновременно, надо хранить в одном месте. Данные и функции, использующие эти данные, обычно изменяются вместе, но бывают исключения[10].

Группы данных

Группы данных, встречающихся совместно, нужно превращать в самостоятельный класс[10].

  • «Выделение метода» (Extract Method) используется для полей;
  • «Введение граничного объекта» (Introduce Parameter Object) или «Сохранение всего объекта» (Preserve Whole Object) для параметров методов[11].

Хорошая проверка: удалить одно из значений данных и проверить, сохранят ли смысл остальные. Если нет, это верный признак того, что данные напрашиваются на объединение их в объект[10].

Одержимость элементарными типами

Проблема связана с использованием элементарных типов вместо маленьких объектов для небольших задач, таких как валюта, диапазоны, специальные строки для телефонных номеров и т. п.

  • «Замена значения данных объектом» (Replace Data Value with Object);
  • «Замена массива объектом» (Replace Array with Object);
  • Если это код типа, то используйте «Замену кода типа классом» (Replace Type Code with Class), «Замену кода типа подклассами» (Replace Type Code with Subclasses) или «Замену кода типа состоянием/стратегией» (Replace Type Code with State/Strategy)[3].

Операторы типа switch

Одним из очевидных признаков объектно-ориентированного кода служит сравнительно редкое использование операторов типа switch (или case). Часто один и тот же блок switch оказывается разбросанным по разным местам программы. При добавлении нового варианта приходится искать все эти блоки switch и модифицировать их. Как правило, заметив блок switch, следует подумать о полиморфизме[12].

  • Если switch переключается по коду типа, то следует использовать «Замену кода типа подклассами» (Replace Type Code with Subclasses) или «Замену кода типа состоянием/стратегией» (Replace Type Code with State/Strategy);
  • Может понадобиться «Выделение метода» (Extract Method) и «Перемещение метода» (Move Method) чтобы изолировать switch и поместить его в нужный класс;
  • После настройки структуры наследования следует использовать «Замену условного оператора полиморфизмом» (Replace Conditional with Polymorphism)[3].

Параллельные иерархии наследования

В коде с таким запашком всякий раз при порождении подкласса одного из классов приходится создавать подкласс другого класса[12].

  • Общая стратегия устранения дублирования состоит в том, чтобы заставить экземпляры одной иерархии ссылаться на экземпляры другой иерархии, а затем убрать иерархию в ссылающемся классе c помощью «Перемещения метода» (Move Method) и «Перемещения поля» (Move Field)[12].

Ленивый класс

Класс, затраты на существование которого не окупаются выполняемыми им функциями, должен быть удалён [12].

  • При наличии подклассов с недостаточными функциями попробуйте «Свертывание иерархии» (Collapse Hierarchy);
  • Почти бесполезные компоненты должны быть подвергнуты «Встраиванию класса» (Inline Class)[12].

Теоретическая общность

Этот случай возникает, когда на определённом этапе существования программы обеспечивается набор механизмов, который, возможно, потребуется для некоторой будущей функциональности. В итоге программу становится труднее понимать и сопровождать[13].

  • Для незадействованных абстрактных классов используйте «Сворачивание иерархии» (Collapse Hierarchy);
  • Ненужная делегация может быть удалена с помощью «Встраивания класса» (Inline Class);
  • Методы с неиспользуемыми параметрами должны быть подвергнуты «Удалению параметров» (Remove Parameter)[3].

Временное поле

Временные поля — это поля, которые нужны объекту только при определённых обстоятельствах. Такое положение вещей трудно для понимания, так как ожидается, что объекту нужны все его поля[14].

  • Временные поля и весь код, работающий с ними, следует поместить в отдельный класс с помощью «Выделения класса» (Extract Class);
  • Удалить условно выполняемый код можно с помощью «Введения объекта Null» (Introduce Null Object) для создания альтернативного компонента[13].

Цепочка вызовов

Цепочка вызовов появляется тогда, когда клиент запрашивает у одного объекта другой объект, другой объект запрашивает ещё один объект и т. д. Такие последовательности вызовов означают, что клиент связан с навигацией по структуре классов. Любые изменения промежуточных связей означают необходимость модификации клиента[13].

  • Для удаления цепочки вызовов применяется приём «Сокрытие делегирования» (Hide Delegate)[13].

Посредник

Чрезмерное использование делегирования может привести к появлению классов, у которых большинство методов состоит только из вызова метода другого класса[13].

  • Если большую часть методов класс делегирует другому классу, нужно воспользоваться «Удалением посредника» (Remove Middle Man)[15].

Неуместная близость

«Неуместная близость» возникает тогда, когда классы чаще, чем следовало бы, погружены в закрытые части друг друга[15].

  • Избавиться от «Неуместной близости» можно с помощью «Перемещения метода» (Move Method) и «Перемещения поля» (Move Field);
  • По возможности следует прибегнуть к «Замене двунаправленной связи однонаправленной» (Change Bidirectional Association to Unidirectional), «Выделению класса» (Extract Class) или воспользоваться «Сокрытием делегирования» (Hide Delegate)[15].

Альтернативные классы с разными интерфейсами

Два класса, в которых часть функциональности общая, но методы, реализующие её, имеют разные параметры[16].

  • Применяйте «Переименование метода» (Rename Method) ко всем методам, выполняющим одинаковые действия, но различающимся сигнатурами[15].

Неполнота библиотечного класса

Библиотеки через некоторое время перестают удовлетворять требованиям пользователей. Естественное решение — поменять кое-что в библиотеках, но библиотечные классы не изменять. Следует использовать методы рефакторинга, специально предназначенные для этой цели[16].

  • Если надо добавить пару методов, используется «Введение внешнего метода» (Introduce Foreign Method);
  • Если надо серьёзно поменять поведение класса, используется «Введение локального расширения» (Introduce Local Extension)[16].

Классы данных

Классы данных — это классы, которые содержат только поля и методы для доступа к ним, это просто контейнеры для данных, используемые другими классами[16].

  • Следует применить «Инкапсуляцию поля» (Encapsulate Field) и «Инкапсуляцию коллекции» (Encapsulate Collection)[3].

Отказ от наследства

Если наследник использует лишь малую часть унаследованных методов и свойств родителя, это является признаком неправильной иерархии.

  • Необходимо создать новый класс на одном уровне с потомком и с помощью «Спуска метода» (Push Down Method) и «Спуска поля» (Push Down Field) вытолкнуть в него все бездействующие методы. Благодаря этому в родительском классе будет содержаться только то, что используется совместно[17].

Комментарии

Часто комментарии играют роль «дезодоранта» кода, который появляется в нём лишь потому, что код плохой. Почувствовав потребность написать комментарий, попробуйте изменить структуру кода так, чтобы любые комментарии стали излишними[17].

  • Если для объяснения действий блока всё же требуется комментарий, попробуйте применить «Выделение метода» (Extract Method);
  • Если метод уже выделен, но по-прежнему нужен комментарий для объяснения его действия, воспользуйтесь «Переименованием метода» (Rename Method);
  • Если требуется изложить некоторые правила, касающиеся необходимого состояния системы, примените «Введение утверждения» (Introduce Assertion)[17].

См. также

Примечания

Литература

  • Martin Fowler. Refactoring. Improving the Design of Existing Code (англ.). — Addison-Wesley, 1999. — ISBN 0-201-48567-2.
  • Фаулер М. Глава 3. Код с душком // Рефакторинг. Улучшение существующего кода = Refactoring: Improving the Design of Existing Code / Пер. с англ. С. Маккавеева. — 1-е изд. — СПб.: Символ-Плюс, 2003. — С. 54—62. — 432 с с. — ISBN 5-93286-045-6.

Ссылки

  • CodeSmell (англ.). Martinfowler.com. Дата обращения: 13 октября 2013.
  • Code Smell (англ.). Cunningham & Cunningham, Inc. (c2.com). Дата обращения: 23 ноября 2013.

Read other articles:

Mark Stevensdalam The Dark Corner (1946)LahirRichard William Stevens(1916-12-13)13 Desember 1916Cleveland, Ohio, Amerika SerikatMeninggal15 September 1994(1994-09-15) (umur 77)Majores, SpanyolNama lainStephen RichardsTahun aktif1943–1987Suami/istriAnnelle Hayes ​(m. 1945⁠–⁠1962)​ (bercerai)Anak2 Mark Stevens (nama lahir: Richard William Stevens, 13 Desember 1916 – 15 September 1994) adalah seorang pemeran Ameri...

 

 

مقاطعة أراباهو     الإحداثيات 39°38′N 104°20′W / 39.64°N 104.33°W / 39.64; -104.33  [1] تاريخ التأسيس 1 نوفمبر 1861  تقسيم إداري  البلد الولايات المتحدة[2]  التقسيم الأعلى كولورادو  العاصمة ليتلتون  خصائص جغرافية  المساحة 2086 كيلومتر مربع  عدد السكان &...

 

 

Dewan Perwakilan Rakyat Daerah Kota PariamanDewan Perwakilan RakyatKota Pariaman2019-2024JenisJenisUnikameral SejarahSesi baru dimulai14 Agustus 2019PimpinanKetuaFitri Nora, A.Md. (Gerindra) sejak 4 Oktober 2019 Wakil Ketua IEfrizal, S.Sos (Golkar) sejak 30 Oktober 2021 Wakil Ketua IIMulyadi (PPP) sejak 4 Oktober 2019 KomposisiAnggota20Partai & kursi  NasDem (3)   Hanura (1)   Demokrat (1)   PAN (2)   Golkar (3)   PPP...

City in Georgia, United StatesDublin, GeorgiaCityDublin City Hall FlagSealNickname: The Emerald CityLocation in Laurens County and the state of GeorgiaCoordinates: 32°32′26″N 82°54′14″W / 32.54056°N 82.90389°W / 32.54056; -82.90389CountryUnited StatesStateGeorgiaCountyLaurensIncorporatedDecember 9, 1812Government • MayorJoshua Kight • City managerJosh Powell (interim)Area[1] • City16.401 sq mi (42....

 

 

Kesunanan Surakarta Hadiningratꦑꦱꦸꦤꦤꦤ꧀ꦯꦸꦫꦏꦂꦠꦲꦢꦶꦤꦶꦁ​ꦫꦠ꧀Kasunanan Surakarta Hadiningrat1745–Sekarang Bendera Lambang(Sri Radya Laksana) Lagu kerajaan: Ladrang Sri Katon[1] Wilayah Kesunanan Surakarta sejak tahun 1830 (warna merah tua); termasuk berbagai daerah enklavenya serta wilayah Kadipaten Mangkunegaran (warna merah muda), yang merupakan wilayah vasal dari Kesunanan Surakarta.[2][3]Ibu kotaSurakartaBahasa resmiJaw...

 

 

Archives 1, 2, 3, 4, 5, 6, 7, 8, 9, 1011, 12, 13, 14, 15 This page has archives. Sections older than 7 days may be automatically archived by Lowercase sigmabot III when more than 1 section is present. I'm no longer an administrator, so if you're looking for someone to undelete something I deleted, you'd be better off asking at WP:REFUND Position Essays may help you understand my point of view with regard to... Notability of Fictional Topics Articles for Deletion My RfA Standards Recreation o...

ロバート・デ・ニーロRobert De Niro 2011年のデ・ニーロ生年月日 (1943-08-17) 1943年8月17日(80歳)出生地 アメリカ合衆国・ニューヨーク州ニューヨーク市身長 177 cm職業 俳優、映画監督、映画プロデューサージャンル 映画、テレビドラマ活動期間 1963年 -配偶者 ダイアン・アボット(1976年 - 1988年)グレイス・ハイタワー(1997年 - )主な作品 『ミーン・ストリート』(1973年)...

 

 

Paleontological site in South Africa Bolt's FarmLocation in GautengLocationGauteng Province, South AfricaCoordinates26°02′00″S 27°42′43″E / 26.033235°S 27.712057°E / -26.033235; 27.712057Part ofCradle of HumankindArea1.3 km2 (0.50 sq mi)HistoryPeriodsEarly Pliocene, Plio-Pleistocene, Late Pleistocene, Holocene Bolt's Farm is a palaeontological site in the Cradle of Humankind World Heritage Site, Gauteng province, South Africa. With more ...

 

 

1989 studio album by NomeansnoWrongStudio album by NomeansnoReleasedFall 1989RecordedSummer 1989StudioProfile Sound Studios, Vancouver, British Columbia, CanadaGenre Post-hardcore[1] jazzcore[2] Length39:54LabelAlternative TentaclesNomeansno chronology Small Parts Isolated and Destroyed(1988) Wrong(1989) Live + Cuddly(1991) Professional ratingsReview scoresSourceRatingAllmusic[2]Rolling Stone(NR)[3] Wrong is the fourth full-length album by Canadian punk...

American politician Sam RohrerMember of the Pennsylvania House of Representativesfrom the 128th districtIn officeJanuary 5, 1993[1] – November 30, 2010Preceded byJames GallenSucceeded byMark Gillen Personal detailsBornSamuel E. Rohrer (1955-08-11) August 11, 1955 (age 68)Dover, Ohio, U.S.Political partyRepublicanSpouseRuth Ann RohrerResidenceRobeson Township, PennsylvaniaAlma materBob Jones UniversityWebsite[1] Samuel E. Rohrer (born August 11, 1955) is an ...

 

 

Ini adalah nama patrilineal Minahasa, marganya adalah Mandagi (rumpun dari Sulawesi Utara) Yang MuliaPetrus Canisius MandagiM.S.C.Uskup Agung MeraukeGerejaGereja Katolik RomaKeuskupan agungMeraukePenunjukan11 November 2020(3 tahun, 183 hari)PendahuluNicolaus Adi Seputra, M.S.C.ImamatTahbisan imam18 Desember 1975[1] (48 tahun, 146 hari)oleh Theodorus Hubertus Moors, M.S.C.Tahbisan uskup18 September 1994(29 tahun, 237 hari)oleh Andreas Peter Corne...

 

 

STKIP YPUP MakassarSekolah Tinggi Keguruan dan Ilmu Pendidikan Yayasan Pendidikan Ujung PandangJenisSekolah TinggiDidirikan1974RektorDr.Iriany Kesuma Wijaya M. PdLokasiMakassar, Sulawesi Selatan, IndonesiaNama julukanKampus Keguruan Favorit di MakassarSitus webstkip-ypup.ac.id Sekolah Tinggi Keguruan dan Ilmu Pendidikan Yayasan Pendidikan Ujung Pandang atau disingkat STKIP YPUP Makassar adalah salah satu perguruan tinggi keguruan di Makassar, Sulawesi Selatan. Program Studi Pendidikan Matemat...

This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these template messages) This article includes a list of references, related reading, or external links, but its sources remain unclear because it lacks inline citations. Please help improve this article by introducing more precise citations. (April 2023) (Learn how and when to remove this message) This article relies largely or entirely on a single source. Relevant...

 

 

منع التلوث (P2)، هو عبارة عن استراتيجية لتقليل كمية النفايات التي يجري توليدها وإطلاقها في البيئة، خاصةً تلك التي تصدر عن المنشآت الصناعية أو الزراعة أو المستهلكين. ترى العديد من الشركات الكبيرة أن منع التلوث هو وسيلة لتحسين كفاءة عمليات الإنتاج وربحيتها عن طريق الحد من تول...

 

 

梅拉蒂·达伊瓦·奥克塔维亚尼Melati Daeva Oktavianti基本資料代表國家/地區 印度尼西亞出生 (1994-10-28) 1994年10月28日(29歲)[1] 印度尼西亞万丹省西冷[1]身高1.68米(5英尺6英寸)[1]握拍右手[1]主項:女子雙打、混合雙打職業戰績48勝–27負(女雙)109勝–56負(混雙)最高世界排名第4位(混雙-普拉文·喬丹)(2020年3月17日[2])現時世界排名第...

Montano Lucinocomune Montano Lucino – VedutaVeduta sul centro di Montano LocalizzazioneStato Italia Regione Lombardia Provincia Como AmministrazioneSindacoAlberto Introzzi (lista civica Insieme per Montano Lucino) dal 27-5-2019 (2º mandato) TerritorioCoordinate45°47′N 9°03′E45°47′N, 9°03′E (Montano Lucino) Altitudine400 m s.l.m. Superficie5,22 km² Abitanti5 400[1] (31-10-2023) Densità1 034,48 ab./km² FrazioniArcissa...

 

 

1998 basketball championship series 1998 NBA Finals TeamCoachWins Chicago Bulls Phil Jackson 4 Utah Jazz Jerry Sloan 2 DatesJune 3–14MVPMichael Jordan(Chicago Bulls)Hall of FamersBulls:Michael Jordan (2009)Toni Kukoc (2021)Scottie Pippen (2010)Dennis Rodman (2011)Jazz:Karl Malone (2010)John Stockton (2009)Coaches:Phil Jackson (2007)Jerry Sloan (2009)Tex Winter (2011)Officials:Dick Bavetta (2015)Hugh Evans (2022)Eastern finalsBulls defeated Pacers, 4–3Western finalsJazz defeated Lakers, 4�...

 

 

Group of alpine and polar freshwater algae An example of snow algae Snow algae are a group of freshwater micro-algae that grow in the alpine and polar regions of the Earth.[1] Snow algae have been found on every continent but are restricted to areas with temperatures between 0°C-10°C.[2] Snow algae are pigmented by chlorophyll and carotenoids and can be a variety of colors depending on the individual species, life stage, and topography/geography.[3][4] The pi...

Samsung Galaxy Tab A 8.0 InformaciónTipo modelo de objeto manufacturadoFabricante Samsung ElectronicsSoftwareSistema operativo Android[editar datos en Wikidata] La Samsung Galaxy Tab A 8.0 es una tableta basada en Android producida y comercializada por Samsung Electronics. Pertenece a la línea “A” de gama media, que también incluye un modelo de 9,7 pulgadas. Se anunció en marzo de 2015 y posteriormente se lanzó el 1 de mayo de 2015.[1]​ Está disponible en versiones s...

 

 

Mexican politician and military general In this Spanish name, the first or paternal surname is Arteaga and the second or maternal family name is Magallanes. Benemérito de la PatriaJosé María ArteagaGovernor of QuerétaroIn officeJuly 1, 1857 – January 29, 1858PresidentBenito JuárezPreceded bySabino FloresSucceeded byFrancisco VerduscoIn officeDecember 1, 1860 – January 10, 1862Preceded bySilvestre MéndezSucceeded bySilvestre MéndezIn officeSeptember 30, 186...