Encapsulamiento (informática)

Diagrama de un objeto y su interacción mediante los métodos, no directamente sobre los datos.

En la programación orientada a objetos (POO), la encapsulación se refiere a la agrupación de datos con los métodos que operan en esos datos, o la restricción del acceso directo a algunos de los componentes de un objeto.[1]​ La encapsulación se utiliza para ocultar los valores o el estado de un objeto de datos estructurados dentro de una clase, evitando el acceso directo a ellos por parte de los clientes de una manera que podría exponer detalles de Implementación ocultos o violar la invariancia de estado mantenida por los métodos.

Sin embargo, ocultar datos no es el alcance total de la ocultación de información. David Parnas introdujo por primera vez el concepto de ocultación de información alrededor de 1972. Argumentó que el criterio principal para la modularización del sistema debería referirse a la ocultación de decisiones críticas de diseño. Hizo hincapié en ocultar «decisiones de diseño difíciles o decisiones de diseño que probablemente cambien». Ocultar información de esa manera aísla a los clientes de requerir un conocimiento profundo del diseño para usar un módulo y de los efectos de cambiar esas decisiones.[1]

Significado

Diagrama de polimorfismo, objetos de tipos distintos con un método para responder a una misma acción. Cada animal responderá con su propio sonido, diferente al resto.

Podríamos decir por tanto que con la encapsulación logramos agrupar datos o restringir el acceso directo a algunos componentes de un objeto, mediante métodos a modo de intermediarios que harán uso de ellos mediante unas reglas definidas. Ayudándonos así por ejemplo a alcanzar otro nivel de la programación orientada a objetos como sería el polimorfismo (no confundir con el polimorfismo en el malware).

El polimorfismo se refiere a la propiedad por la que es posible enviar mensajes sintácticamente iguales a objetos de tipos distintos. El único requisito que deben cumplir los objetos que se utilizan de manera polimórfica es saber responder al mensaje que se les envía.

El ejemplo más claro de encapsulación y polimorfismo sería un programa capaz de calcular las áreas de distintos polígonos, un cliente solo debería de conocer la existencia del método encargado de devolver el área, sin necesidad de preocuparse del proceso interno para calcular las mismas, puesto que el cálculo del área de un cono no se corresponde con la de un rectángulo. Será tarea del programador asegurar la encapsulación para que los métodos que devuelven el área de los distintos objetos de diferentes polígonos respondan de la misma manera, cada uno mediante su propia fórmula matemática de cálculo del área, logrando así el mencionado polimorfismo.

De esta forma además de que el usuario de la clase puede obviar la implementación de los métodos y propiedades para concentrarse solo en cómo usarlos, evita que el usuario pueda cambiar su estado de maneras imprevistas e incontroladas.

Encapsulación y herencia

Los autores de "Design Patterns" [2]​ discuten la tensión entre la herencia y la encapsulación y afirman que, en su experiencia, los diseñadores abusan de la herencia. Afirman que la herencia a menudo rompe la encapsulación, dado que la herencia expone una subclase a los detalles de la implementación de su clase padre. Como se describe en el problema del yo-yo, el uso excesivo de la herencia y, por lo tanto, la encapsulación, puede volverse demasiado complicado y difícil de depurar.

Modificadores de acceso

Los modificadores de acceso son palabras clave que se usan para especificar la accesibilidad declarada de un miembro o un tipo. Depende del lenguaje de programación que se use, pero los más comunes son:

  • Default: En el caso del lenguaje Java, los miembros de datos, clase o métodos que no se declaran utilizando ningún modificador de acceso, es decir, que tengan un modificador de acceso predeterminado, solo son accesibles dentro del mismo paquete.[3]
  • Public: El acceso público es el nivel de acceso más permisivo. No hay ninguna restricción para el acceso a miembros públicos.[4]
  • Protected: Un miembro protegido es accesible dentro de su clase y por parte de instancias de clases derivadas.[5]
  • Private: El acceso privado es el nivel de acceso menos permisivo. Los miembros privados solo son accesibles dentro del cuerpo de la clase o el struct[6]​ en el que se declaran.[7]
  • Internal: Solo se puede tener acceso a los tipos internos o los miembros desde los archivos del mismo ensamblado.[8]
  • Protected internal: Se puede obtener acceso a un miembro protected internal desde el ensamblado actual o desde tipos que se deriven de la clase contenedora.[9]
  • Private protected: Los miembros private protected están accesibles para los tipos que se deriven de la clase contenedora, pero solo desde dentro del ensamblado correspondiente que lo contenga.[10]

Ejemplos

Un ejemplo de la lógica empleada en pseudocódigo:

Declaración de la clase genérica
{
	Declaración de variable, modificador de acceso y tipo

	[ENCAPSULACIÓN] Declaración de método para leer variable
	{
		Acceso al valor de la variable
	}

	[ENCAPSULACIÓN] Declaración de método para sobrescribir variable
	{
		Acceso a la variable para insertar nuevo valor
	}
}

Declaración de la clase principal
{
	Declaración de un objeto de la clase genérica

	Llamada al método de sobreescritura del valor de la variable del objeto creado de la clase genérica

	Llamada al método de lectura del valor de la variable del objeto creado de la clase genérica
}

[Salida]:

Valor de la variable, introducido en el objeto mediante la llamada al método de sobreescritura

Un ejemplo real en el lenguaje de programación C#:

// ===================================================================================
//  Ejemplo de encapsulación en C#
// ===================================================================================

// Declaración de la clase "ClaseEjemplo"
public class ClaseEjemplo
{
    // Campos declarados como privados
    // Por lo que solo podrán ser utilizados mediante métodos públicos de la clase

    // Campo de valor alfanumérico, su valor será tomado como texto
    // De introducirse números no serán matemáticamente computables
    private String nombre;
    // Campo de valor entero (integer), no aceptaría otra cosa que números enteros
    // Estos números si serían matemáticamente computables, por lo que se le podrían sumar años, por ejemplo 
    private int edad;

    // Descriptores de acceso get/set para controlar el acceso al atributo nombre
    public String DescriptorNombre
    {
        get
        {
            // Devolvemos el valor del campo nombre
            return nombre;
        }

        set
        {
            // Asignamos valor al campo nombre
            // Es obligatorio usar value
            nombre = value;
        }
    }

    // Descriptores de acceso get/set para controlar el acceso al atributo edad
    public int DescriptorEdad
    {
        get
        {
            // Devolvemos el valor del campo edad
            return edad;
        }

        set
        {
            // Asignamos valor al campo edad
            // Es obligatorio usar value
            edad = value;
        }
    }
}

// Declaración de la clase principal
class ClasePrincipal
{
    // Método principal, es obligatorio que se llame "Main"
    static public void Main()
    {
        // Creamos un objeto de la clase "ClaseEjemplo"
        ClaseEjemplo objeto = new ClaseEjemplo();

        // Llamamos al disruptor de acceso al atributo “nombre” del objeto creado
        // Le pasamos "Nombre de la persona" como valor alfanumérico para el parámetro value
        objeto.DescriptorNombre = "Nombre de la persona";

        // Llamamos al disruptor de acceso al atributo “edad” del objeto creado
        // Le pasamos "00" como valor entero para el parámetro value
        objeto.DescriptorEdad = 00;

        // Mostramos el valor de los campos en la consola de comandos
        // Al no pasarle un valor, el descriptor entiende que lo que debe de hacer es devolverlo
        Console.WriteLine("Nombre: " + objeto.DescriptorNombre);
        Console.WriteLine("Edad: " + objeto.DescriptorEdad);
    }
}

Salida:

Consola de comandos
Nombre: Nombre de la persona

Edad: 00



En caso de intentar acceder directamente a uno de los campos de la clase, saltándonos por tanto la encapsulación:

Console.WriteLine("Nombre: " + objeto.nombre);

El propio compilador ya nos avisaría del error con respecto a los modificadores de acceso:[11]

Error    CS0122   "ClaseEjemplo.nombre' no es accesible debido a su nivel de protección"

Referencias

  1. a b Wm. Paul Rogers (18 de mayo de 2001). «Encapsulation is not information hiding» (en inglés). 
  2. Gamma, Erich; Helm, Richard; Johnson, Ralph; Vlissides, John (1994). Design Patterns (en inglés). Addison-Wesley. ISBN 978-0-201-63361-0. (requiere registro). 
  3. Oracle - Java. «Controlling Access to Members of a Class» (en inglés). 
  4. Microsoft. «public (Referencia de C#)». 
  5. Microsoft. «protected (Referencia de C#)». 
  6. Microsoft. «struct (C++)». 
  7. Microsoft. «private (Referencia de C#)». 
  8. Microsoft. «internal (Referencia de C#)». 
  9. Microsoft. «protected internal (Referencia de C#)». 
  10. Microsoft. «private protected (Referencia de C#)». 
  11. Microsoft. «Error del compilador CS0122». 

Read other articles:

Untuk bagian akhir Yeremia 25 dalam Septuaginta, lihat Yeremia 49. Yeremia 25Kitab Yeremia dalam Alkitab Ibrani, MS Sassoon 1053, foto 283-315.KitabKitab YeremiaKategoriNevi'imBagian Alkitab KristenPerjanjian LamaUrutan dalamKitab Kristen24← pasal 24 pasal 26 → Yeremia 25 (disingkat Yer 25) adalah pasal kedua puluh lima Kitab Yeremia dalam Alkitab Ibrani dan Perjanjian Lama di Alkitab Kristen. Berisi perkataan nabi Yeremia bin Hilkia, tentang Yehuda dan Yerusalem, yang hidup pada ...

 

 

1971 soundtrack album by Earth, Wind & FireSweet Sweetback's Baadasssss SongSoundtrack album by Earth, Wind & FireReleasedJune 1971Recorded1971GenreFunk, soulLength37:28LabelStaxEarth, Wind & Fire chronology The Need of Love(1971) Sweet Sweetback's Baadasssss Song(1971) Last Days and Time(1972) Melvin Van Peebles chronology Watermelon Man(1970) Sweet Sweetback's Baadasssss Song(1971) Ain't Supposed To Die A Natural Death(1972) Professional ratingsReview scoresSourceRatingA...

 

 

Wally Hickel Gubernur Alaska ke-2 dan ke-8Masa jabatan3 Desember 1990 – 5 Desember 1994WakilJack Coghill PendahuluSteve CowperPenggantiTony KnowlesMasa jabatan5 Desember 1966 – 29 Januari 1969WakilKeith Harvey Miller PendahuluWilliam A. EganPenggantiKeith Harvey MillerMenteri Dalam Negeri Amerika Serikat ke-38Masa jabatan24 Januari 1969 – 25 November 1970PresidenRichard Nixon PendahuluStewart UdallPenggantiRogers Morton Informasi pribadiLahirWalter Joseph Hick...

Artikel ini sebatang kara, artinya tidak ada artikel lain yang memiliki pranala balik ke halaman ini.Bantulah menambah pranala ke artikel ini dari artikel yang berhubungan atau coba peralatan pencari pranala.Tag ini diberikan pada Oktober 2022. Letnan JenderalHarinder SinghPVSM, AVSM , VSM, YSM, SMJenderal Harinder Singh saat bertugas sebagai panglima brigade Kivu Utara pada 2012Pengabdian IndiaDinas/cabang Angkatan Darat IndiaLama dinas1983 – kiniPangkat Letnan JenderalNRPIC...

 

 

Синелобый амазон Научная классификация Домен:ЭукариотыЦарство:ЖивотныеПодцарство:ЭуметазоиБез ранга:Двусторонне-симметричныеБез ранга:ВторичноротыеТип:ХордовыеПодтип:ПозвоночныеИнфратип:ЧелюстноротыеНадкласс:ЧетвероногиеКлада:АмниотыКлада:ЗавропсидыКласс:Пт�...

 

 

President of the United States from 1901 to 1909 This article is about the president of the United States. For other people with the same name, see Theodore Roosevelt (disambiguation). This article may be too long to read and navigate comfortably. When this tag was added, its readable prose size was 17,000 words. Consider splitting content into sub-articles, condensing it, or adding subheadings. Please discuss this issue on the article's talk page. (June 2023) Theodore Roosevelt Roosevelt c.&...

Penyuntingan Artikel oleh pengguna baru atau anonim untuk saat ini tidak diizinkan.Lihat kebijakan pelindungan dan log pelindungan untuk informasi selengkapnya. Jika Anda tidak dapat menyunting Artikel ini dan Anda ingin melakukannya, Anda dapat memohon permintaan penyuntingan, diskusikan perubahan yang ingin dilakukan di halaman pembicaraan, memohon untuk melepaskan pelindungan, masuk, atau buatlah sebuah akun. Adolf HitlerPotret resmi, 1938 Führer JermanMasa jabatan2 Agustus 1934 –&...

 

 

Not to be confused with Stratford, Connecticut; Stafford, Connecticut; or Stanford, California. City in Connecticut, United StatesStamfordCityClockwise, from top: Downtown Stamford, Harbor Point, Stamford Museum & Nature Center, Stamford Center for the Arts, Fish Church, One Stamford Forum, Stamford Transportation Center, Old Town Hall, One Landmark Square FlagSealNickname(s): The City That Works, Lock CityMotto: Innovating Since 1641 Fairfield County and Connecticut W...

 

 

PT Bank Negara Indonesia (Persero) TbkLogo sejak 2004Kantor pusat BNI di JakartaSebelumnyaBank Negara Indonesia 1946 (1968–1992)JenisPerusahaan perseroan (Persero) terbukaKode emitenIDX: BBNIDidirikan5 Juli 1946; 77 tahun lalu (1946-07-05)PendiriPemerintah Indonesia[a]KantorpusatJakarta Selatan, DKI JakartaWilayah operasiIndonesiaTokohkunciRoyke Tumilaar[2](Direktur Utama)Pradjoto[3](Komisaris Utama)ProdukTabunganPinjamanKartu kreditKartu debitReksa danaAsuransi...

Hotel in Manhattan, New York Hotel 57 The Allerton Hotel for Women, today known as Hotel 57, is a hotel located at 130 East 57th Street in the New York City borough of Manhattan. It is a seventeen-story brick, limestone, and terra cotta building designed by Arthur Loomis Harmon in 1920. It was built on the southwest corner of Lexington Avenue and 57th Street by the Allerton House Company at a cost of $700,000. It originally had stores on its ground floor.[1] The hotel intended to acco...

 

 

German lawyer (1906–after 1947) OberlandesgerichtsratHans MüllerMüller as a witness during the Nuremberg TrialsBorn18 September 1906GießenDiedafter 1947NationalityGermanEducationBavarian AssesorTitlePersonal assistant to the Reichsleiter Martin BormannPolitical partyNSDAPCriminal statusdenazifiedPartnermarriedChildren2 (born in 1937 and 1939) Hans Müller (born 18 September 1906 in Giessen; died after 1947) was a German lawyer. Müller was the personal assistant to the head of the Nazi P...

 

 

Stasiun Jardim São Paulo-Ayrton SennaPlatform di Stasiun Jardim São Paulo-Ayrton SennaLokasiAv. Leôncio de Magalhães, 1000 - Jardim São PauloKoordinat23°29′33″S 46°37′02″W / 23.492473°S 46.6171092°W / -23.492473; -46.6171092Koordinat: 23°29′33″S 46°37′02″W / 23.492473°S 46.6171092°W / -23.492473; -46.6171092PemilikCompanhia do Metropolitano de São PauloJalurJalur 1-BiruJumlah peronPusatKonstruksiTinggi peronBawah ta...

مارتن شوارزشيلد (بالألمانية: Martin Schwarzschild)‏  معلومات شخصية الميلاد 31 مايو 1912(1912-05-31)[1]بوتسدام  الوفاة 10 أبريل 1997 (84 سنة) [1]لانغهورن  مواطنة ألمانيا الولايات المتحدة  عضو في الأكاديمية الألمانية للعلوم - ليوبولدينا،  والأكاديمية الوطنية للعلوم،  والأكا...

 

 

This article may require copy editing for grammar, style, cohesion, tone, or spelling. You can assist by editing it. (October 2023) (Learn how and when to remove this message) State flag of New Jersey Location of New Jersey on U.S. map The following is a list of notable people born, raised, or closely associated with the U.S. state of New Jersey. This is a dynamic list and may never be able to satisfy particular standards for completeness. You can help by adding missing items with reliable s...

 

 

Segunda División 1985-1986Liga Adelante 1985-1986 Competizione Segunda División Sport Calcio Edizione 55ª Organizzatore RFEF Luogo  Spagna Partecipanti 20 Formula Girone all'italiana Risultati Vincitore  Real Murcia Promozioni  Real Murcia Sabadell Maiorca Retrocessioni  Albacete Deportivo Aragón Tenerife Atlético Madrileño Cronologia della competizione 1984-1985 1986-1987 Manuale L'edizione 1985-86 della Segunda División fu il cinquantacin...

Crazy FrogInformasi latar belakangAsalGothenburg, SwedenGenreElectronic dance musicTahun aktif1997–presentLabelMinistry of Sound, Universal, Mach 1 Crazy Frog . Crazy Frog adalah karakter animasi yang digunakan untuk pasar nada dering berdasarkan dari The Annoying Thing, animasi komputer yang dibuat oleh Erik Wernquist. Crazy Frog dipasarkan oleh penyedia nada dering, Jamba!. Animasi Crazy Frog dibuat untuk menemani efek suara yang diproduksi oleh Daniel Malmedahl. Crazy Frog muncul di selu...

 

 

Port Loko, Sierra Leone Bunce IslandA satellite picture of Freetown, 2006.Bunce IslandGeographyLocationSierra Leone RiverCoordinates8°34′N 13°02′W / 8.567°N 13.033°W / 8.567; -13.033AdministrationSierra LeoneAdditional informationTime zoneGreenwich Mean Time (UTC±0) Bunce Island (also spelled Bence, Bense, or Bance at different periods) is an island in the Sierra Leone River. It is situated in Freetown Harbour, the estuary of the Rokel River and Port Loko Cree...

 

 

Free HTML layout engine GeckoDeveloper(s)Mozilla Foundation, Mozilla Corporation, Adobe Systems, and other contributorsStable release125 / 4 November 2022; 17 months ago (4 November 2022) Repositoryhg.mozilla.org/mozilla-central/ Written inC++, JavaScript, RustTypeBrowser engineLicenseMPL 2.0[1][2]Websitedeveloper.mozilla.org/en-US/docs/Glossary/Gecko Gecko (stylized as ɢecko) is a browser engine developed by Mozilla. It is used in the Firefox browser, the Thunde...

 本表是動態列表,或許永遠不會完結。歡迎您參考可靠來源來查漏補缺。 潛伏於中華民國國軍中的中共間諜列表收錄根據公開資料來源,曾潛伏於中華民國國軍、被中國共產黨聲稱或承認,或者遭中華民國政府調查審判,為中華人民共和國和中國人民解放軍進行間諜行為的人物。以下列表以現今可查知時間為準,正確的間諜活動或洩漏機密時間可能早於或晚於以下所歸�...

 

 

Anna Atkins algae cyanotype Sun printing may refer to various printing techniques which use sunlight as a developing or fixative agent. Techniques Cyanotype Main article: Cyanotype Cyanotype, also referred to as blueprinting, is the oldest non-silver photographic printing process.[1] It involves exposing materials which have been treated with a solution of potassium ferricyanide and ferric ammonium citrate to a UV light source such as the sun. Negative or positive images can be obtain...