స్ట్రక్చరల్ డేటా డిస్ట్రక్చరింగ్ ద్వారా జావాస్క్రిప్ట్ యొక్క ప్యాటర్న్ మ్యాచింగ్ సామర్థ్యాలను అన్వేషించండి. ప్రపంచ డెవలపర్ల కోసం ఆచరణాత్మక ఉదాహరణలతో శుభ్రమైన, నమ్మకమైన మరియు నిర్వహించదగిన కోడ్ను ఎలా వ్రాయాలో తెలుసుకోండి.
జావాస్క్రిప్ట్ ప్యాటర్న్ మ్యాచింగ్: బలమైన కోడ్ కోసం స్ట్రక్చరల్ డేటా డిస్ట్రక్చరింగ్
జావాస్క్రిప్ట్, హాస్కెల్ లేదా స్కాలా వంటి భాషల లాగా సాంప్రదాయకంగా అధునాతన ప్యాటర్న్ మ్యాచింగ్ కోసం ప్రసిద్ధి చెందనప్పటికీ, స్ట్రక్చరల్ డేటా డిస్ట్రక్చరింగ్ ద్వారా శక్తివంతమైన సామర్థ్యాలను అందిస్తుంది. ఈ టెక్నిక్ డేటా స్ట్రక్చర్ల (ఆబ్జెక్ట్లు మరియు అర్రేలు) నుండి వాటి ఆకారం మరియు నిర్మాణం ఆధారంగా విలువలను సంగ్రహించడానికి మిమ్మల్ని అనుమతిస్తుంది, తద్వారా మరింత సంక్షిప్త, చదవగలిగే మరియు నిర్వహించదగిన కోడ్ను రాయడానికి వీలు కల్పిస్తుంది. ఈ బ్లాగ్ పోస్ట్ జావాస్క్రిప్ట్లో స్ట్రక్చరల్ డేటా డిస్ట్రక్చరింగ్ అనే భావనను అన్వేషించింది, ప్రపంచవ్యాప్తంగా ఉన్న డెవలపర్లకు సంబంధించిన ఆచరణాత్మక ఉదాహరణలు మరియు వినియోగ సందర్భాలను అందిస్తుంది.
స్ట్రక్చరల్ డేటా డిస్ట్రక్చరింగ్ అంటే ఏమిటి?
స్ట్రక్చరల్ డేటా డిస్ట్రక్చరింగ్ అనేది ECMAScript 6 (ES6)లో ప్రవేశపెట్టబడిన ఒక ఫీచర్, ఇది ఆబ్జెక్ట్లు మరియు అర్రేల నుండి విలువలను సంగ్రహించి వాటిని వేరియబుల్స్కు కేటాయించడానికి ఒక సంక్షిప్త మార్గాన్ని అందిస్తుంది. ఇది తప్పనిసరిగా ప్యాటర్న్ మ్యాచింగ్ యొక్క ఒక రూపం, ఇక్కడ మీరు సంగ్రహించాలనుకుంటున్న డేటా యొక్క నిర్మాణానికి సరిపోయే ఒక నమూనాను నిర్వచిస్తారు. నమూనా సరిపోలితే, విలువలు సంగ్రహించబడి కేటాయించబడతాయి; లేకపోతే, డిఫాల్ట్ విలువలను ఉపయోగించవచ్చు లేదా కేటాయింపును దాటవేయవచ్చు. ఇది సాధారణ వేరియబుల్ కేటాయింపులకు మించి వెళ్లి, అసైన్మెంట్ ప్రక్రియలో సంక్లిష్టమైన డేటా మానిప్యులేషన్ మరియు కండిషనల్ లాజిక్ను అనుమతిస్తుంది.
నెస్ట్ చేయబడిన ప్రాపర్టీలను యాక్సెస్ చేయడానికి దీర్ఘమైన కోడ్ రాయడానికి బదులుగా, డిస్ట్రక్చరింగ్ ఈ ప్రక్రియను సులభతరం చేస్తుంది, మీ కోడ్ను మరింత డిక్లరేటివ్ మరియు సులభంగా అర్థమయ్యేలా చేస్తుంది. ఇది డెవలపర్లను డేటా స్ట్రక్చర్ను ఎలా నావిగేట్ చేయాలో కాకుండా, వారికి అవసరమైన డేటాపై దృష్టి పెట్టడానికి అనుమతిస్తుంది.
ఆబ్జెక్ట్లను డిస్ట్రక్చరింగ్ చేయడం
ఆబ్జెక్ట్ డిస్ట్రక్చరింగ్ ఒక ఆబ్జెక్ట్ నుండి ప్రాపర్టీలను సంగ్రహించి వాటిని అదే లేదా వేర్వేరు పేర్లతో వేరియబుల్స్కు కేటాయించడానికి మిమ్మల్ని అనుమతిస్తుంది. సింటాక్స్ ఈ క్రింది విధంగా ఉంటుంది:
const obj = { a: 1, b: 2, c: 3 };
const { a, b } = obj; // a = 1, b = 2
ఈ ఉదాహరణలో, a
మరియు b
ప్రాపర్టీల విలువలు obj
ఆబ్జెక్ట్ నుండి సంగ్రహించబడి, వరుసగా a
మరియు b
అనే వేరియబుల్స్కు కేటాయించబడ్డాయి. ప్రాపర్టీ లేనట్లయితే, సంబంధిత వేరియబుల్కు undefined
కేటాయించబడుతుంది. డిస్ట్రక్చరింగ్ చేసేటప్పుడు వేరియబుల్ పేరును మార్చడానికి మీరు అలియాస్ కూడా ఉపయోగించవచ్చు.
const { a: newA, b: newB } = obj; // newA = 1, newB = 2
ఇక్కడ, a
ప్రాపర్టీ యొక్క విలువ newA
వేరియబుల్కు, మరియు b
ప్రాపర్టీ యొక్క విలువ newB
వేరియబుల్కు కేటాయించబడింది.
డిఫాల్ట్ విలువలు
ఆబ్జెక్ట్లో లేని ప్రాపర్టీల కోసం మీరు డిఫాల్ట్ విలువలను అందించవచ్చు. ఇది ఆబ్జెక్ట్లో ప్రాపర్టీ లేకపోయినా, వేరియబుల్స్కు ఎల్లప్పుడూ ఒక విలువ కేటాయించబడుతుందని నిర్ధారిస్తుంది.
const obj = { a: 1 };
const { a, b = 5 } = obj; // a = 1, b = 5 (default value)
ఈ సందర్భంలో, obj
ఆబ్జెక్ట్లో b
అనే ప్రాపర్టీ లేనందున, b
వేరియబుల్కు 5
యొక్క డిఫాల్ట్ విలువ కేటాయించబడింది.
నెస్ట్ చేయబడిన ఆబ్జెక్ట్ డిస్ట్రక్చరింగ్
నెస్ట్ చేయబడిన ఆబ్జెక్ట్లతో కూడా డిస్ట్రక్చరింగ్ను ఉపయోగించవచ్చు, ఇది ఆబ్జెక్ట్ స్ట్రక్చర్లో లోతుగా ఉన్న ప్రాపర్టీలను సంగ్రహించడానికి మిమ్మల్ని అనుమతిస్తుంది.
const obj = { a: 1, b: { c: 2, d: 3 } };
const { b: { c, d } } = obj; // c = 2, d = 3
ఈ ఉదాహరణ నెస్ట్ చేయబడిన ఆబ్జెక్ట్ b
నుండి c
మరియు d
ప్రాపర్టీలను ఎలా సంగ్రహించాలో ప్రదర్శిస్తుంది.
రెస్ట్ ప్రాపర్టీలు
రెస్ట్ సింటాక్స్ (...
) ఒక ఆబ్జెక్ట్ యొక్క మిగిలిన ప్రాపర్టీలను కొత్త ఆబ్జెక్ట్లో సేకరించడానికి మిమ్మల్ని అనుమతిస్తుంది.
const obj = { a: 1, b: 2, c: 3 };
const { a, ...rest } = obj; // a = 1, rest = { b: 2, c: 3 }
ఇక్కడ, a
ప్రాపర్టీ సంగ్రహించబడింది, మరియు మిగిలిన ప్రాపర్టీలు (b
మరియు c
) rest
అనే కొత్త ఆబ్జెక్ట్లో సేకరించబడ్డాయి.
అర్రేలను డిస్ట్రక్చరింగ్ చేయడం
అర్రే డిస్ట్రక్చరింగ్ ఒక అర్రే నుండి ఎలిమెంట్లను సంగ్రహించి, వాటి స్థానం ఆధారంగా వాటిని వేరియబుల్స్కు కేటాయించడానికి మిమ్మల్ని అనుమతిస్తుంది. సింటాక్స్ ఆబ్జెక్ట్ డిస్ట్రక్చరింగ్ను పోలి ఉంటుంది, కానీ కర్లీ బ్రేస్లకు బదులుగా స్క్వేర్ బ్రాకెట్లను ఉపయోగిస్తుంది.
const arr = [1, 2, 3];
const [a, b] = arr; // a = 1, b = 2
ఈ ఉదాహరణలో, అర్రే యొక్క మొదటి ఎలిమెంట్ a
వేరియబుల్కు మరియు రెండవ ఎలిమెంట్ b
వేరియబుల్కు కేటాయించబడ్డాయి. ఆబ్జెక్ట్ల మాదిరిగానే, మీరు కామాలను ఉపయోగించి ఎలిమెంట్లను దాటవేయవచ్చు.
const arr = [1, 2, 3];
const [a, , c] = arr; // a = 1, c = 3
ఇక్కడ, రెండవ ఎలిమెంట్ దాటవేయబడింది, మరియు మూడవ ఎలిమెంట్ c
వేరియబుల్కు కేటాయించబడింది.
డిఫాల్ట్ విలువలు
అర్రేలో లేని లేదా undefined
అయిన ఎలిమెంట్ల కోసం మీరు డిఫాల్ట్ విలువలను కూడా అందించవచ్చు.
const arr = [1];
const [a, b = 5] = arr; // a = 1, b = 5
ఈ సందర్భంలో, అర్రేలో ఒకే ఒక ఎలిమెంట్ ఉన్నందున, b
వేరియబుల్కు 5
యొక్క డిఫాల్ట్ విలువ కేటాయించబడింది.
రెస్ట్ ఎలిమెంట్లు
రెస్ట్ సింటాక్స్ (...
) మిగిలిన ఎలిమెంట్లను కొత్త అర్రేలో సేకరించడానికి అర్రేలతో కూడా ఉపయోగించవచ్చు.
const arr = [1, 2, 3, 4];
const [a, b, ...rest] = arr; // a = 1, b = 2, rest = [3, 4]
ఇక్కడ, మొదటి రెండు ఎలిమెంట్లు a
మరియు b
వేరియబుల్స్కు కేటాయించబడ్డాయి, మరియు మిగిలిన ఎలిమెంట్లు rest
అనే కొత్త అర్రేలో సేకరించబడ్డాయి.
ఆచరణాత్మక వినియోగ సందర్భాలు మరియు ఉదాహరణలు
స్ట్రక్చరల్ డేటా డిస్ట్రక్చరింగ్ కోడ్ రీడబిలిటీ మరియు మెయింటెనబిలిటీని మెరుగుపరచడానికి వివిధ సందర్భాలలో ఉపయోగించవచ్చు. ఇక్కడ కొన్ని ఆచరణాత్మక ఉదాహరణలు ఉన్నాయి:
1. ఫంక్షన్ పారామీటర్లు
ఫంక్షన్ పారామీటర్లను డిస్ట్రక్చరింగ్ చేయడం వలన ఫంక్షన్కు ఆర్గ్యుమెంట్గా పంపబడిన ఆబ్జెక్ట్ నుండి నిర్దిష్ట ప్రాపర్టీలను లేదా అర్రే నుండి ఎలిమెంట్లను సంగ్రహించడానికి మిమ్మల్ని అనుమతిస్తుంది. ఇది మీ ఫంక్షన్ సిగ్నేచర్లను శుభ్రంగా మరియు మరింత వ్యక్తీకరణగా చేస్తుంది.
function greet({ name, age }) {
console.log(`Hello, ${name}! You are ${age} years old.`);
}
const person = { name: 'Alice', age: 30 };
greet(person); // Output: Hello, Alice! You are 30 years old.
ఈ ఉదాహరణలో, greet
ఫంక్షన్ name
మరియు age
ప్రాపర్టీలతో ఒక ఆబ్జెక్ట్ను ఆశిస్తుంది. ఫంక్షన్ ఈ ప్రాపర్టీలను నేరుగా సంగ్రహించడానికి ఆబ్జెక్ట్ పారామీటర్ను డిస్ట్రక్చర్ చేస్తుంది.
2. మాడ్యూల్స్ను ఇంపోర్ట్ చేయడం
మాడ్యూల్స్ను ఇంపోర్ట్ చేసేటప్పుడు, మాడ్యూల్ నుండి నిర్దిష్ట ఎక్స్పోర్ట్లను సంగ్రహించడానికి డిస్ట్రక్చరింగ్ ఉపయోగించవచ్చు.
import { useState, useEffect } from 'react';
ఈ ఉదాహరణ డిస్ట్రక్చరింగ్ ఉపయోగించి react
మాడ్యూల్ నుండి useState
మరియు useEffect
ఫంక్షన్లను ఎలా ఇంపోర్ట్ చేయాలో చూపిస్తుంది.
3. APIలతో పని చేయడం
APIల నుండి డేటాను పొందుతున్నప్పుడు, API స్పందన నుండి సంబంధిత సమాచారాన్ని సంగ్రహించడానికి డిస్ట్రక్చరింగ్ ఉపయోగించవచ్చు. సంక్లిష్టమైన JSON స్పందనలతో వ్యవహరించేటప్పుడు ఇది ప్రత్యేకంగా ఉపయోగపడుతుంది.
async function fetchData() {
const response = await fetch('https://api.example.com/users/1');
const { id, name, email } = await response.json();
console.log(`User ID: ${id}, Name: ${name}, Email: ${email}`);
}
ఈ ఉదాహరణ ఒక API ఎండ్పాయింట్ నుండి డేటాను పొంది, id
, name
, మరియు email
ప్రాపర్టీలను సంగ్రహించడానికి JSON స్పందనను డిస్ట్రక్చర్ చేస్తుంది.
4. వేరియబుల్స్ను మార్చడం
తాత్కాలిక వేరియబుల్ ఉపయోగించకుండా రెండు వేరియబుల్స్ విలువలను మార్చడానికి డిస్ట్రక్చరింగ్ ఉపయోగించవచ్చు.
let a = 1;
let b = 2;
[a, b] = [b, a]; // a = 2, b = 1
ఈ ఉదాహరణ అర్రే డిస్ట్రక్చరింగ్ ఉపయోగించి a
మరియు b
వేరియబుల్స్ విలువలను మారుస్తుంది.
5. బహుళ రిటర్న్ విలువలను నిర్వహించడం
కొన్ని సందర్భాల్లో, ఫంక్షన్లు అర్రేగా బహుళ విలువలను తిరిగి ఇవ్వవచ్చు. ఈ విలువలను ప్రత్యేక వేరియబుల్స్కు కేటాయించడానికి డిస్ట్రక్చరింగ్ ఉపయోగించవచ్చు.
function getCoordinates() {
return [10, 20];
}
const [x, y] = getCoordinates(); // x = 10, y = 20
ఈ ఉదాహరణ x
మరియు y
కోఆర్డినేట్లను సంగ్రహించడానికి getCoordinates
ఫంక్షన్ ద్వారా తిరిగి ఇవ్వబడిన అర్రేను ఎలా డిస్ట్రక్చర్ చేయాలో ప్రదర్శిస్తుంది.
6. అంతర్జాతీయీకరణ (i18n)
అంతర్జాతీయీకరణ (i18n) లైబ్రరీలతో పనిచేసేటప్పుడు డిస్ట్రక్చరింగ్ ఉపయోగకరంగా ఉంటుంది. అనువదించబడిన స్ట్రింగ్లు లేదా ఫార్మాటింగ్ నియమాలను సులభంగా యాక్సెస్ చేయడానికి మీరు లోకేల్-నిర్దిష్ట డేటాను డిస్ట్రక్చర్ చేయవచ్చు.
const translations = {
en: {
greeting: "Hello",
farewell: "Goodbye"
},
fr: {
greeting: "Bonjour",
farewell: "Au revoir"
}
};
function greetIn(locale) {
const { greeting } = translations[locale];
console.log(`${greeting}!`);
}
greetIn('fr'); // Output: Bonjour!
ఇది ఒక నిర్దిష్ట లోకేల్ కోసం అనువాదాలను సులభంగా ఎలా పొందాలో చూపిస్తుంది.
7. కాన్ఫిగరేషన్ ఆబ్జెక్ట్లు
అనేక లైబ్రరీలు మరియు ఫ్రేమ్వర్క్లలో కాన్ఫిగరేషన్ ఆబ్జెక్ట్లు సాధారణం. డిస్ట్రక్చరింగ్ నిర్దిష్ట కాన్ఫిగరేషన్ ఎంపికలను సంగ్రహించడం సులభం చేస్తుంది.
const config = {
apiUrl: "https://api.example.com",
timeout: 5000,
maxRetries: 3
};
function makeApiRequest({ apiUrl, timeout }) {
console.log(`Making request to ${apiUrl} with timeout ${timeout}`);
}
makeApiRequest(config);
ఇది ఫంక్షన్లు తమకు అవసరమైన కాన్ఫిగరేషన్ను మాత్రమే స్వీకరించడానికి అనుమతిస్తుంది.
స్ట్రక్చరల్ డేటా డిస్ట్రక్చరింగ్ను ఉపయోగించడం వల్ల కలిగే ప్రయోజనాలు
- మెరుగైన కోడ్ రీడబిలిటీ: డిస్ట్రక్చరింగ్ డేటా స్ట్రక్చర్ల నుండి ఏ విలువలు సంగ్రహించబడుతున్నాయో స్పష్టంగా చూపడం ద్వారా మీ కోడ్ను మరింత సంక్షిప్తంగా మరియు సులభంగా అర్థమయ్యేలా చేస్తుంది.
- తగ్గిన బాయిలర్ప్లేట్ కోడ్: డిస్ట్రక్చరింగ్ ప్రాపర్టీలు మరియు ఎలిమెంట్లను యాక్సెస్ చేయడానికి అవసరమైన బాయిలర్ప్లేట్ కోడ్ మొత్తాన్ని తగ్గిస్తుంది, మీ కోడ్ను శుభ్రంగా మరియు తక్కువ పునరావృతంగా చేస్తుంది.
- మెరుగైన కోడ్ మెయింటెనబిలిటీ: నెస్ట్ చేయబడిన ప్రాపర్టీలు మరియు ఎలిమెంట్లను యాక్సెస్ చేసేటప్పుడు లోపాల సంభావ్యతను తగ్గించడం ద్వారా డిస్ట్రక్చరింగ్ మీ కోడ్ను మరింత నిర్వహించదగినదిగా చేస్తుంది.
- పెరిగిన ఉత్పాదకత: డేటా స్ట్రక్చర్ల నుండి విలువలను సంగ్రహించే ప్రక్రియను సరళీకృతం చేయడం ద్వారా డిస్ట్రక్చరింగ్ మీకు సమయం మరియు కృషిని ఆదా చేస్తుంది.
- మరింత వ్యక్తీకరణ కోడ్: మీ ఉద్దేశాన్ని స్పష్టంగా తెలియజేయడం మరియు మీకు అవసరమైన డేటాపై దృష్టి పెట్టడం ద్వారా డిస్ట్రక్చరింగ్ మిమ్మల్ని మరింత వ్యక్తీకరణ కోడ్ను వ్రాయడానికి అనుమతిస్తుంది.
ఉత్తమ పద్ధతులు
- అర్థవంతమైన వేరియబుల్ పేర్లను ఉపయోగించండి: డిస్ట్రక్చరింగ్ చేసేటప్పుడు, సంగ్రహించిన విలువల అర్థాన్ని స్పష్టంగా సూచించే వేరియబుల్ పేర్లను ఉపయోగించండి.
- డిఫాల్ట్ విలువలను అందించండి: ఊహించని లోపాలను నివారించడానికి తప్పిపోయిన ప్రాపర్టీలు మరియు ఎలిమెంట్ల కోసం ఎల్లప్పుడూ డిఫాల్ట్ విలువలను అందించండి.
- డిస్ట్రక్చరింగ్ ప్యాటర్న్లను సరళంగా ఉంచండి: కోడ్ రీడబిలిటీని నిర్వహించడానికి అధికంగా సంక్లిష్టమైన డిస్ట్రక్చరింగ్ ప్యాటర్న్లను నివారించండి.
- డిస్ట్రక్చరింగ్ను వివేకంతో ఉపయోగించండి: డిస్ట్రక్చరింగ్ శక్తివంతమైనది అయినప్పటికీ, మీ కోడ్ను తక్కువ స్పష్టంగా చేసే పరిస్థితులలో దానిని అతిగా ఉపయోగించకుండా వివేకంతో ఉపయోగించండి.
- కోడ్ శైలిని పరిగణించండి: మీ కోడ్ చదవగలిగేలా మరియు నిర్వహించగలిగేలా ఉండేలా డిస్ట్రక్చరింగ్ ఉపయోగించేటప్పుడు స్థిరమైన కోడ్ శైలి మార్గదర్శకాలను అనుసరించండి.
ప్రపంచవ్యాప్త పరిగణనలు
ప్రపంచవ్యాప్త ప్రేక్షకుల కోసం జావాస్క్రిప్ట్ రాసేటప్పుడు, స్ట్రక్చరల్ డేటా డిస్ట్రక్చరింగ్ను ఉపయోగించేటప్పుడు ఈ క్రింది పరిగణనలను గుర్తుంచుకోండి:
- డేటా స్ట్రక్చర్లు: మీరు డిస్ట్రక్చర్ చేస్తున్న డేటా స్ట్రక్చర్లు వివిధ ప్రాంతాలు మరియు లోకేల్లలో స్థిరంగా మరియు బాగా నిర్వచించబడ్డాయని నిర్ధారించుకోండి.
- డేటా ఫార్మాట్లు: డేటా ఫార్మాట్లలో (ఉదా., తేదీ మరియు సమయ ఫార్మాట్లు, సంఖ్య ఫార్మాట్లు) సంభావ్య వ్యత్యాసాల గురించి తెలుసుకోండి మరియు డిస్ట్రక్చరింగ్ చేసేటప్పుడు వాటిని తగిన విధంగా నిర్వహించండి.
- క్యారెక్టర్ ఎన్కోడింగ్: మీ కోడ్ విభిన్న క్యారెక్టర్ ఎన్కోడింగ్లను సరిగ్గా నిర్వహిస్తుందని నిర్ధారించుకోండి, ప్రత్యేకించి వివిధ భాషలలోని టెక్స్ట్ డేటాతో వ్యవహరించేటప్పుడు.
- లోకేల్-నిర్దిష్ట డేటా: లోకేల్-నిర్దిష్ట డేటాను డిస్ట్రక్చర్ చేసేటప్పుడు, మీరు సరైన లోకేల్ సెట్టింగ్లను ఉపయోగిస్తున్నారని మరియు డేటా సరిగ్గా స్థానికీకరించబడిందని నిర్ధారించుకోండి.
ముగింపు
స్ట్రక్చరల్ డేటా డిస్ట్రక్చరింగ్ అనేది జావాస్క్రిప్ట్లో ఒక శక్తివంతమైన ఫీచర్, ఇది కోడ్ రీడబిలిటీ, మెయింటెనబిలిటీ మరియు ఉత్పాదకతను గణనీయంగా మెరుగుపరుస్తుంది. ఈ బ్లాగ్ పోస్ట్లో వివరించిన భావనలు మరియు ఉత్తమ పద్ధతులను అర్థం చేసుకోవడం ద్వారా, ప్రపంచవ్యాప్తంగా ఉన్న డెవలపర్లు శుభ్రమైన, మరింత బలమైన మరియు మరింత వ్యక్తీకరణ కోడ్ను వ్రాయడానికి డిస్ట్రక్చరింగ్ను ఉపయోగించుకోవచ్చు. మీ జావాస్క్రిప్ట్ టూల్కిట్లో భాగంగా డిస్ట్రక్చరింగ్ను స్వీకరించడం వలన మరింత సమర్థవంతమైన మరియు ఆనందించే అభివృద్ధి అనుభవాలకు దారితీస్తుంది, ఇది ప్రపంచ ప్రేక్షకుల కోసం అధిక-నాణ్యత సాఫ్ట్వేర్ను సృష్టించడానికి దోహదపడుతుంది. జావాస్క్రిప్ట్ అభివృద్ధి చెందుతున్న కొద్దీ, ఆధునిక వెబ్ అప్లికేషన్లను రూపొందించడానికి ఈ ప్రాథమిక ఫీచర్లలో నైపుణ్యం సాధించడం చాలా ముఖ్యం.